BZOJ 刷題記錄 PART 5

拖了好久才寫的。

【BZOJ2821】接觸分塊大法。這道題略有點新穎。首先我們先分塊,然後統計每塊中每個數出現的個數。

下面是聯立各個方塊,預處理出第I個方塊到第J個方塊出現正偶數次數的個數。

for (i=1;i<=s;i++)
  {
    for (j=i;j<=s;j++)
    {
      sum[i][j]=sum[i][j-1];
      for (k=a[j].l;k<=a[j].r;k++)
      {
        temp[data[k]]++;
        if (!(temp[data[k]]&1)) sum[i][j]++;
        else if (temp[data[k]]>1) sum[i][j]--;
      }
    }
    memset(temp,0,sizeof(temp));
  }

其實查詢的時候也是和上面類似的。注意統計零散的點時要和已經預處理好的整數塊發生關係。

【BZOJ1189】還是比較水的。先二分一個答案,然後拆點構圖。

【BZOJ3060】這是想法題。——哈哈,看題解的!首先,一條邊上如果兩個點的編號都大於K,顯然我們不需要刪。那麼倒着做,先全部拆開,然後先把上述的邊加上去(並查集)。遇到連上標號小於等於K的點的邊——如果兩端都在同一連通塊,那麼這條邊必須刪;否則合併連通塊。

【BZOJ1306】T到要死!!SKYDEC大爺推薦我做。感覺數據範圍還是挺小的,然後就被爆了。首先,有些剪枝是必須加的,比如當前的隊伍的分數加上之後比賽*3仍然小於要求的分數就退出等等。

狂T。後來我預處理了一下,用cut[I][J]表示第i個隊伍在第J場的時候後面還有屬於他的幾場。

for (i=1;i<=n;i++)
  {
    for (j=m;j;j--)
      cut[i][j]=cut[i][j+1]+(beat[j].u==i)+(beat[j].v==i);
    for (j=1;j<=m;j++)
      cut[i][j]=cut[i][j+1];
  }

還是T。後來我發現我是枚舉到最終才判斷所有隊是否合法。其實在每一隊的最後一場比賽時我們就可以判斷了。A。

【BZOJ1832】真是奇怪的LCA。開始用TARJAN的,後來發現最後驗證的時候還要LCA!果斷轉倍增。

【BZOJ2724】分塊好題。權限題啦啦啦。

【BZOJ1965】數論還是要好好學。搞了半天總算搞懂了擴歐求解同餘方程。

LL extend_gcd(LL a,LL b,LL &x,LL &y)
{
  if (b==0){x=1;y=0;return a;}
  LL temp=extend_gcd(b,a%b,x,y);
  LL t=x;x=y;y=t-a/b*y;return temp;
}
int main()
{
  scanf("%lld%lld%lld",&B,&b,&n);B++;
  A=pow();
  extend_gcd(A,B,x,y);
  x=x*n%B;
  while (x<=0) x+=B;
  while (x>B) x-=B;
  printf("%lld",x);
  return 0;
}

【BZOJ1966】據說是什麼AC自動機什麼的?反正我直接DP使過了。耶!

【BZOJ1967】我用奇怪的貪心使。(見騙分導論)還打了一個點。

  for (i=1;i<=n;i++)
  {
    t1=(sx>x[i])&&(sy>y[i])&&(sx<x[i]+c[i])&&(sy<y[i]+c[i]);
    t2=(tx>x[i])&&(ty>y[i])&&(tx<x[i]+c[i])&&(ty<y[i]+c[i]);
    if (t1^t2) ans++;
  }

【BZOJ2287】揹包。

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