BZOJ 刷題記錄 PART 3

【前言】還是強調要少看題解。

【BZOJ1090】簡單的區間DP。值得注意的是:在壓縮的時候,如果是10個A壓縮,那麼化成(10)A後有5個字符而不是4個!(我在這裏被坑了好長時間!)以下是核心代碼:

for (len=2;len<=L;len++)
    for (i=1;i<=L-len+1;i++)
    {
      j=i+len-1;
      for (k=i;k<j;k++)
        f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
      for (l=1;l<=len/2;l++)
      {
        if (len%l) continue;
        flag=1;q=i;
        for (p=i+l;p<=j;p++)
        {
          if (s[p]!=s[q]) {flag=0;break;}
          q++;if (q==i+l) q=i;
        }
        if (flag) f[i][j]=min(f[i][j],f[i][i+l-1]+3+(len/l>9)+(len/l>99));
      }
    }

【BZOJ3373】很有趣的一道題。我是用N^4低飛的,枚舉沒一頭牛,然後floyed驗證是否說謊。值得注意的是,USACO上的最後一個數據(很小)我一直過不去,原來題意有點不太清楚。“可能說謊的奶牛是指如果這頭奶牛說謊則輸入數據中不存在矛盾”。如果一頭牛說謊了,我開始是把他所說的邊給去掉,但其實是反向(因爲他說謊了)。

【BZOJ3400】把取模後的值當做DP的下標進行處理。要開滾存。

for (i=1;i<=n;i++)
  {
    memcpy(f,g,sizeof(g));
    for (j=0;j<s;j++)
      if (g[j]) up(f[(j+a[i])%s]+=g[j]);
    up(++f[a[i]]);
    memcpy(g,f,sizeof(f));
  }
【BZOJ3401】維護一個應該叫做“單調棧”的東東。水題放鬆心情!

for (i=n;i;i--)
  {
    while (t&&a[q[t]]<=a[i]) t--;
    if (t) ans[i]=q[t];else ans[i]=0;
    q[++t]=i;
  }
【BZOJ1416】據XXX證明,摸球順序可以無視。也就是可以理解爲:小球是按順序摸的。高精度模擬。

【BZOJ1150】就是在一堆數中選M組相鄰的數,不能重複選,使距離和最小。有一個方法可以避免重複。比如間隔是3,2,3,你選了間隔2後顯然不能選旁邊的兩個3了,但是要反悔怎麼辦?可以把這條線段的值改爲左面的線段的值+右面的線段的值-自己的值。這樣,如果你後來又選了這個數,表明你是選擇了兩個3的。

【BZOJ2660】神奇的DP。如果用01表示第I項是否選,我們可以發現100和011是相等的。根據這個來DP。

【BZOJ3370】我用n^2logN使過的,但是其實可以用N^2。

sort(a+1,a+n+1,cmp);
  for (i=1;i<=n;i++)
  {
    Miny=a[i].y;
    while (!q.empty()) q.pop();
    for (k=1;k<=n;k++)
    {
      Minx=a[k].x;
      if (a[k].y<Miny) continue;
      q.push(a[k].z);
      while (!q.empty()&&q.top()-Minx-Miny>C) q.pop();
      ans=max(ans,(int)q.size());
    }
  }

【BZOJ2657】ZJOI的水題。這可以描述成一棵樹,然後求樹的直徑。

【BZOJ3208】開始還以爲是二維樹狀數組,看到數據範圍果斷開始打暴力。T T

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章