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】背包。

原文地址:https://www.cnblogs.com/mthoutai/p/7025840.html