题目链接

二维莫队,按x,y坐标一起分块.(x,y)的所属的块为 x/sq(n)*sq(m) + y/sq(m)

排序时按照(左下点所在块,右上点的标号)排序

排序后 先得出一个询问的答案,然后利用上一个询问的矩形与当前矩形位置关系更新答案

转移真的麻烦。。为了避免算重 一定要加个vis[][]

  1. //4432kb 13600ms
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. typedef long long LL;
  8. const int N=205,M=1e5+5;
  9. int n,m,Q,szX,szY,A[N][N],ref[N*N],tm[N*N],bel[N][N],idv[N][N];
  10. LL Ans[M],Now;
  11. bool vis[N][N];
  12. struct Ask
  13. {
  14. int x1,y1,x2,y2,id;
  15. inline bool operator <(const Ask &a)const{
  16. return bel[x1][y1]==bel[a.x1][a.y1]?idv[x2][y2]<idv[a.x2][a.y2]:bel[x1][y1]<bel[a.x1][a.y1];
  17. }
  18. }q[M];
  19. inline int read()
  20. {
  21. int now=0,f=1;register char c=gc();
  22. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  23. for(;isdigit(c);now=now*10+c-'0',c=gc());
  24. return now*f;
  25. }
  26. int Find(int x,int r)
  27. {
  28. int l=1,mid;
  29. while(l<r)
  30. if(ref[mid=l+r>>1]>=x) r=mid;
  31. else l=mid+1;
  32. return l;
  33. }
  34. void Discrete()
  35. {
  36. int tot=0,cnt=1;
  37. for(int i=1; i<=n; ++i)
  38. for(int j=1; j<=m; ++j)
  39. ref[idv[i][j]=++tot]=A[i][j]=read();
  40. std::sort(ref+1,ref+1+tot);
  41. for(int i=2; i<=tot; ++i)
  42. if(ref[i]!=ref[i-1]) ref[++cnt]=ref[i];
  43. for(int i=1; i<=n; ++i)
  44. for(int j=1; j<=m; ++j)
  45. A[i][j]=Find(A[i][j],cnt);
  46. }
  47. inline void add(int i,int j){
  48. if(!vis[i][j]) vis[i][j]=1, Now+=2*(tm[A[i][j]]++)+1;
  49. }
  50. inline void subd(int i,int j){
  51. if(vis[i][j]) vis[i][j]=0, Now-=2*(--tm[A[i][j]])+1;
  52. }
  53. void Add(int x1,int x2,int y1,int y2)
  54. {
  55. for(int i=x1; i<=x2; ++i)
  56. for(int j=y1; j<=y2; ++j) add(i,j);
  57. }
  58. void Subd(int x1,int x2,int y1,int y2)
  59. {
  60. for(int i=x1; i<=x2; ++i)
  61. for(int j=y1; j<=y2; ++j) subd(i,j);
  62. }
  63. void Change(int l,int n)
  64. {//now位于las的左下方 左上方 被包含 都是可能的
  65. int t;
  66. t=std::min(q[l].x1-1,q[n].x2), Add(q[n].x1,t,q[n].y1,q[n].y2);
  67. t=std::min(q[l].y1-1,q[n].y2), Add(q[n].x1,q[n].x2,q[n].y1,t);
  68. t=std::max(q[l].x2+1,q[n].x1), Add(t,q[n].x2,q[n].y1,q[n].y2);
  69. t=std::max(q[l].y2+1,q[n].y1), Add(q[n].x1,q[n].x2,t,q[n].y2);
  70. t=std::min(q[l].x2,q[n].x1-1), Subd(q[l].x1,t,q[l].y1,q[l].y2);
  71. t=std::min(q[l].y2,q[n].y1-1), Subd(q[l].x1,q[l].x2,q[l].y1,t);
  72. t=std::max(q[l].y1,q[n].y2+1), Subd(q[l].x1,q[l].x2,t,q[l].y2);
  73. t=std::max(q[l].x1,q[n].x2+1), Subd(t,q[l].x2,q[l].y1,q[l].y2);
  74. }
  75. int main()
  76. {
  77. n=read(),m=read(); szX=sqrt(n),szY=sqrt(m);
  78. Discrete();
  79. for(int i=1; i<=n; ++i)
  80. for(int j=1; j<=m; ++j)
  81. bel[i][j]=(i-1)/szX*szY+(j-1)/szY;
  82. // for(int i=1; i<=n; ++i,putchar('\n'))
  83. // for(int j=1; j<=m; ++j) printf("%d ",bel[i][j]);
  84. Q=read();
  85. for(int i=1; i<=Q; ++i)
  86. {
  87. q[i].x1=read(),q[i].y1=read(),q[i].x2=read(),q[i].y2=read();
  88. if(q[i].x1>q[i].x2) std::swap(q[i].x1,q[i].x2);//将(x1,y1)设为矩形左下角
  89. if(q[i].y1>q[i].y2) std::swap(q[i].y1,q[i].y2);
  90. q[i].id=i;
  91. }
  92. std::sort(q+1,q+1+Q);
  93. Add(q[1].x1,q[1].x2,q[1].y1,q[1].y2);
  94. Ans[q[1].id]=Now;
  95. for(int i=2; i<=Q; ++i)
  96. Change(i-1,i), Ans[q[i].id]=Now;
  97. for(int i=1; i<=Q; ++i) printf("%lld\n",Ans[i]);
  98. return 0;
  99. }

BZOJ.2639.矩形计算(二维莫队)的更多相关文章

  1. 【二维莫队】【二维分块】bzoj2639 矩形计算

    <法一>二维莫队,对n和m分别分块后,对块从上到下从左到右依次编号,询问以左上角所在块编号为第一关键字,以右下角标号为第二关键字排序,转移时非常厉害. O(q*n*sqrt(n)). #i ...

  2. [CSP-S模拟测试]:蔬菜(二维莫队)

    题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...

  3. csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」

    改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...

  4. 【Unity3D】计算二维向量夹角(-180到180)

    在Unity3D中,有时候我们需要计算二维向量的夹角.二维向量夹角一般在0~180度之前,可以直接调用Vector2.Angle(Vector2 from, Vector2 to)来计算. 但是在有些 ...

  5. PHP计算二维数组指定元素的和

    array_sum(array_column($arr, 'num')); //计算二维数组指定元素的和 $arr = [ [ 'id'=>1, 'num'=>3, ], [ 'id'=& ...

  6. bzoj 2038 小z的袜子 莫队例题

    莫队,利用可以快速地通过一个问题的答案得到另一问题的答案这一特性,合理地组织问题的求解顺序,将已解决的问题帮助解决当前问题,来优化时间复杂度. 典型用法:处理静态(无修改)离线区间查询问题. 线段树也 ...

  7. bzoj 2038 小Z的袜子 莫队算法

    题意 给你一个长度序列,有多组询问,每次询问(l,r)任选两个数相同的概率.n <= 50000,数小于等于n. 莫队算法裸题. 莫队算法:将序列分为根号n段,将询问排序,以L所在的块为第一关键 ...

  8. BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)

    传送门 解题思路 刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够..试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做..这道题做法具体来说就是开\(3 ...

  9. BZOJ 3289 Mato的文件管理(莫队+离散化求逆序数)

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 2171  Solved: 891 [Submit][Status][ ...

随机推荐

  1. 【Mysql sql inject】POST方法BASE64编码注入write-up

      翻到群里的小伙伴发出一道POST型SQL注入题,简单抓包判断出题目需要base64编码后才执行sql语句,为学习下SQL注入出题与闯关的思路+工作不是很忙,所以花点时间玩了一下,哈哈哈哈哈哈哈哈哈 ...

  2. PCA主成分分析+白化

    参考链接:http://deeplearning.stanford.edu/wiki/index.php/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90 h ...

  3. 使用neo4j-import工具导入数据

    从Neo4j2.2版本开始,系统就自带了一个大数据量的导入工具:neo4j-import,可支持并行.可扩展的大规模csv数据导入(本例版本为:3.4.7版本) 1.前提条件 关闭neo4j 无法在原 ...

  4. 手把手教你写makefile【原创】

    Makefile  编写 Make  -f  makefile1 指定 如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址: http://www.cnblogs ...

  5. 在Linux,误删磁盘分区怎么恢复呢【转】

    在我们运维工作中,频繁的操作,可能命令写入错误,造成磁盘分区的删除,那么应该怎么办呢?怎么恢复磁盘分区呢? 一不小心删除了磁盘分区.如下图,删除了sda磁盘的第一个分区,为系统boot分区,系统如果重 ...

  6. Python3学习笔记24-操作文件和目录

    环境变量 在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看: import os print(os.environ) 操作文件和目录 操作文件和目录的函数一部分放在o ...

  7. saltstack自动化运维系列②之saltstack的数据系统

    saltstack自动化运维系列②之saltstack的数据系统 grains:搜集minion启动时的系统信息,只有在minion启动时才会搜集,grains更适合做一些静态的属性值的采集,例如设备 ...

  8. centos重启报错Umounting file systems:umount:/opt:device is busy

    系统重启报错: Umounting file systems:umount:/opt:device is busy 只能硬关机,回想一下最近刚安装了nod32 for linux x64的杀毒软件,开 ...

  9. MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'

    今天在删除一个库的时候报错,如下图所示. 删除命名:mysqladmin –u root –p  drop shiro 解决办法: 删除./shiro目录下面的所有文件和目录. 重新执行删除命令即可!

  10. 实现自己的Koa2

    这部分的代码在https://github.com/zhaobao1830/koa2中demo文件夹中 Koa就是基于node自带的http模块,经过封装,监听端口,实现ctx(上下文)管理,中间件管 ...