【BZOJ2727】双十字(动态规划,树状数组)

题面

BZOJ

洛谷

题解

我们去年暑假的时候考试考过。

我当时写了个大暴力混了\(70\)分。。。。

大暴力是这么写的:

预处理每个位置向左右/上/下能够拓展的最多的长度(左右相当于分别求然后取\(min\))

接着枚举双十字的中轴线,所在的列

然后枚举上面那一行,枚举下面那一行。

那么,贡献显然是上面选择的左右长度\(*\)下面可以选择的左右长度\(*\)上下两行分别向上/下拓展的长度。

发现复杂度瓶颈在于枚举完上面那一行之后又去枚举下面那一行。

这个东西显然可以前缀和优化,那么每次修改都是一个区间加法,并且还是加等差数列。

线段树或者树状数组就好啦?

线段树怎么维护可以参考洛谷上那道无聊的数列

树状数组的做法,首先要知道怎么维护区间加法

核心思想是差分。

我们要加一个等差数列,如果只进行一次差分,那么就是给差分数组做区间加法。

这样显然还不行,所以我们对于差分数组再差分一次,假设得到的数组是\(c_i\),原数组是\(a_i\),差分一次的结果是\(b_i\)

那么

\[\begin{aligned}
\sum_{i=1}^xa_i&=\sum_{i=1}^x\sum_{j=1}^ib[i]\\
&=\sum_{i=1}^x(x-i+1)b[i]\\
&=\sum_{i=1}^x(x-i+1)\sum_{j=1}^ic[i]\\
&=\sum_{i=1}^xc[i]\sum_{j=i}^x(x-j+1)\\
&=\sum_{i=1}^xc[i]\times\frac{1}{2}(n-i+2)(n-i+1)\\
&=\frac{1}{2}\sum_{i=1}^xc[i]((n^2+3n+2)-(i^2+(2n+3)i))
\end{aligned}
\]

用树状数组维护\(c[i],ic[i],i^2c[i]\)即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. #define RG register
  9. #define MAX 1500000
  10. #define MOD 1000000009
  11. #define inv2 500000005
  12. #define id(x,y) ((x-1)*m+y)
  13. inline int read()
  14. {
  15. RG int x=0,t=1;RG char ch=getchar();
  16. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  17. if(ch=='-')t=-1,ch=getchar();
  18. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  19. return x*t;
  20. }
  21. void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
  22. bool vis[MAX];
  23. int n,m,L[MAX],U[MAX],D[MAX],ans,K;
  24. int c1[MAX],c2[MAX],c3[MAX];
  25. inline int lb(int x){return x&(-x);}
  26. void modify(int x,int w)
  27. {
  28. for(int i=x;i<=m;i+=lb(i))
  29. {
  30. add(c1[i],w);
  31. add(c2[i],1ll*x*w%MOD);
  32. add(c3[i],1ll*x*x%MOD*w%MOD);
  33. }
  34. }
  35. int getsum(int x)
  36. {
  37. int s1=0,s2=0,s3=0,ret=0;
  38. for(int i=x;i;i-=lb(i))
  39. add(s1,c1[i]),add(s2,c2[i]),add(s3,c3[i]);
  40. add(ret,(1ll*(x+3)*x%MOD+2)*s1%MOD);add(ret,s3);
  41. add(ret,MOD-1ll*(x+x+3)*s2%MOD);
  42. ret=1ll*ret*inv2%MOD;
  43. return ret;
  44. }
  45. void modify(int l,int r,int w){modify(l,w);modify(r+1,MOD-w);}
  46. void init(){for(int i=1;i<=m;++i)c1[i]=c2[i]=c3[i]=0;}
  47. int main()
  48. {
  49. n=read();m=read();K=read();
  50. for(int i=1;i<=n*m;++i)vis[i]=true;
  51. while(K--)vis[id(read(),read())]=false;
  52. for(int i=1;i<=n;++i)//Left
  53. {
  54. int s=0,now=(i-1)*m+1;
  55. for(int j=1;j<=m;++j,++now)
  56. {
  57. s=vis[now]?s+1:0;
  58. L[now]=s;
  59. }
  60. }
  61. for(int i=1;i<=n;++i)//Right
  62. {
  63. int s=0,now=i*m;
  64. for(int j=m;j>=1;--j,--now)
  65. {
  66. s=vis[now]?s+1:0;
  67. L[now]=min(L[now],s);if(L[now])--L[now];
  68. }
  69. }
  70. for(int j=1;j<=m;++j)//Up
  71. {
  72. int s=0,now=j;
  73. for(int i=1;i<=n;++i,now+=m)
  74. {
  75. s=vis[now]?s+1:0;
  76. U[now]=s;if(U[now])--U[now];
  77. }
  78. }
  79. for(int j=1;j<=m;++j)//Down
  80. {
  81. int s=0,now=id(n,j);
  82. for(int i=n;i>=1;--i,now-=m)
  83. {
  84. s=vis[now]?s+1:0;
  85. D[now]=s;if(D[now])--D[now];
  86. }
  87. }
  88. for(int j=2;j<m;++j,init())
  89. for(int i=3;i<n;++i)
  90. {
  91. int u=id(i,j);
  92. if(!vis[u]){init();continue;}
  93. if(L[u])add(ans,1ll*D[u]*getsum(L[u]-1)%MOD);
  94. modify(1,L[u-m],U[u-m]);
  95. }
  96. printf("%d\n",ans);
  97. return 0;
  98. }

【BZOJ2727】双十字(动态规划,树状数组)的更多相关文章

  1. 【bzoj1109】[POI2007]堆积木Klo 动态规划+树状数组

    题目描述 Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置 ...

  2. BZOJ 2727 双十字(树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2727 题意: 思路:思路来自这里.首先对于每个位置(i,j)用C[i][j]表示该位置同 ...

  3. 2015 CCPC-C-The Battle of Chibi (UESTC 1217)(动态规划+树状数组)

    赛后当天学长就说了树状数组,结果在一个星期后赖床时才有了一点点思路…… 因为无法提交,不确定是否正确..嗯..有错希望指出,谢谢... 嗯..已经A了..提交地址http://acm.uestc.ed ...

  4. BZOJ4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...

  5. BZOJ4993 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4993 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...

  6. BZOJ1264 [AHOI2006]基因匹配Match 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1264 题意概括 给出两个长度为5*n的序列,每个序列中,有1~n各5个. 求其最长公共子序列长度. ...

  7. 【BZOJ4361】isn 动态规划+树状数组+容斥

    [BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...

  8. #46 delete(动态规划+树状数组)

    二维的dp非常显然,但这也没有什么优化的余地了. 注意到最后的方案中只有产生贡献的位置是有用的,剩下的部分可以在该范围内任意选取. 所以我们考虑设f[i]为i号位最后产生贡献的答案,则f[i]=max ...

  9. BZOJ 1264 AHOI2006 基因匹配Match 动态规划+树状数组

    题目大意:给定n个数和两个长度为n*5的序列,每一个数恰好出现5次,求两个序列的LCS n<=20000.序列长度就是10W.朴素的O(n^2)一定会超时 所以我们考虑LCS的一些性质 LCS的 ...

  10. BZOJ3594 SCOI2014方伯伯的玉米田(动态规划+树状数组)

    可以发现每次都对后缀+1是不会劣的.考虑dp:设f[i][j]为前i个数一共+1了j次时包含第i个数的LIS长度.则f[i][j]=max(f[i][j-1],f[k][l]+1) (k<i,l ...

随机推荐

  1. idea开启jquery提示及如何找到学习目标

    idea开启jquery提示 根据这些library就知道该学习哪些技术了

  2. 根据xml生成相应的对象类

    根据xml生成相应的class对象,听起来很难其实很简单,用xsd.exe就能办到 打开vs 命令行运行xsd.exe 你的xml文件地址 空格/outputdir:存放xsd的地址 ok,这是生成了 ...

  3. windows环境下apache-apollo服务器搭建及发布订阅测试

    查证了一些资料之后,发现 apache-apollo服务器使用的人还是挺多的,资料也比较齐全,所以直接选择 apache-apollo了,具体性能如何,先用起来再说吧: 1.下载 apache-apo ...

  4. TPO 03 - Architecture

    TPO 03 - Architecture Architecture is the art and science of designing structures that[主语是Architectu ...

  5. android 签名相关

    查看keystorekeytool -list -v -keystore debug.keystoreapk签名不带别名 apksigner sign --ks debug.keystore test ...

  6. spark重点知识

    1 scala 2 spark rdd 3 sprak core 4 性能优化 5 spark sql 6 spark streaming 掌握程度-精通的理解:

  7. Tomcat源码学习(2)——启动过程分析

    Tomcat启动过程分析 启动 tomcat 时,Windows下执行 startup.bat :Linux下执行 startup.sh 文件,实际上最后都是调用 org.apache.catalin ...

  8. 2019CSUST集训队选拔赛题解(三)

    PY学长的放毒题 Description 下面开始PY的香港之行,PY有n个要去的小吃店,这n个小吃店被m条路径联通起来. PY有1个传送石和n−1个传送石碎片. PY可以用传送石标记一个小吃店作为根 ...

  9. 华为笔试——C++消重输出

    题目:消重输出 题目介绍: 输入一个正整数,给出消除重复数字以后最大的整数,注意需要考虑长整数. 例: 输入:988274320 输出:9874320 题目分析:这个结果的实现需要两个步骤:消重和排序 ...

  10. 软工实践-Alpha 冲刺 (10/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...