1176: [Balkan2007]Mokia

Time Limit: 30 Sec   Memory Limit: 162 MB

Submit: 185  
Solved: 94

[
Submit][
Status]

Description

维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值。 修改操作数M<=160000,询问数Q<=10000,W<=2000000。

Input

 

Output

 

Sample Input

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5

HINT

Input file Output file Meaning
0 4 Table size is , filled with zeroes.

1 2 3 3 Add 3 customers at (2, 3).
2 1 1 3 3 Query sum of rectangle , .

3 Answer.
1 2 2 2 Add 2 customers at (2, 2).
2 2 2 3 4 Query sum of rectangle , .

5 Answer
3 Exit your program.


裸CDQ...1A

注意几个关键部分的写法

步骤:

1.读入询问,按x排序

2.将[L,R]中的数分为前部分操作,后部分操作(各部分仍保持X升序)

3.将前面对后面的影响记录ans

4.复原影响

5.递归[L,M],[M+1,R]

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<functional>
  7. #include<cmath>
  8. #include<cctype>
  9. #include<cassert>
  10. #include<climits>
  11. using namespace std;
  12. #define For(i,n) for(int i=1;i<=n;i++)
  13. #define Rep(i,n) for(int i=0;i<n;i++)
  14. #define Fork(i,k,n) for(int i=k;i<=n;i++)
  15. #define ForD(i,n) for(int i=n;i;i--)
  16. #define Forp(x) for(int p=pre[x];p;p=next[p])
  17. #define RepD(i,n) for(int i=n;i>=0;i--)
  18. #define MEM(a) memset(a,0,sizeof(a))
  19. #define MEMI(a) memset(a,127,sizeof(a))
  20. #define MEMi(a) memset(a,128,sizeof(a))
  21. #define INF (2139062143)
  22. #define F (1000000009)
  23. #define MAXM (640000+10)
  24. #define MAXQ (10000+10)
  25. #define MAXN (2000000+10)
  26. typedef long long ll;
  27. int n,m,q;
  28. ll ans[MAXQ];
  29. struct comm
  30. {
  31. int no,x,y,v,q,type;
  32. comm():no(0),x(0),y(0),v(0),q(0),type(0){}
  33. comm(int _no,int _x,int _y,int _v,int _q,int _type):no(_no),x(_x),y(_y),v(_v),q(_q),type(_type){}
  34. friend bool operator<(comm a,comm b){return a.x<b.x;}
  35. }ask[MAXM];
  36. struct arr_tree
  37. {
  38. ll a[MAXN];
  39. arr_tree(){memset(a,0,sizeof(a));}
  40. void add(int x,ll c)
  41. {
  42. for(int i=x;i<=n;i+=i&(-i)) a[i]+=c;
  43. }
  44. int qur(int x)
  45. {
  46. ll ans=0;
  47. for(int i=x;i;i-=i&(-i)) ans+=a[i];
  48. return ans;
  49. }
  50. void clear()
  51. {
  52. memset(a,0,sizeof(a));
  53. }
  54. }T;
  55. comm tmp[MAXM];
  56. void solve(int l,int r)
  57. {
  58. if (l==r) return;
  59. int m=l+r>>1;
  60. int s1=l-1,s2=m;
  61. Fork(i,l,r) tmp[ask[i].no<=m?++s1:++s2]= ask[i];
  62. memcpy(ask+l,tmp+l,sizeof(comm)*(r-l+1));
  63. int now=l;
  64. Fork(i,m+1,r) //遍历询问
  65. {
  66. if (ask[i].type==2)
  67. {
  68. while (ask[now].x<=ask[i].x&&now<=m)
  69. {
  70. if (ask[now].type==1) T.add(ask[now].y,ask[now].v);
  71. now++;
  72. }
  73. ans[ask[i].q]+=ask[i].v*T.qur(ask[i].y);
  74. }
  75. }
  76. now--;
  77. while (l<=now) {if (ask[now].type==1) T.add(ask[now].y,-ask[now].v);now--;}
  78. solve(l,m),solve(m+1,r);
  79. }
  80. bool work()
  81. {
  82. scanf("%d",&n);
  83. int type,no=0,x,y,x1,y1,x2,y2,v,q=0;
  84. memset(ans,0,sizeof(ans));T.clear();
  85. while (scanf("%d",&type))
  86. {
  87. if (type==0||type==3) break;
  88. else if (type==1)
  89. {
  90. scanf("%d%d%d",&x,&y,&v);
  91. no++;ask[no]=comm(no,x,y,v,0,1);
  92. }
  93. else if (type==2)
  94. {
  95. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);q++;
  96. no++;ask[no]=comm(no,x1-1,y1-1,1,q,2);
  97. no++;ask[no]=comm(no,x2,y2,1,q,2);
  98. no++;ask[no]=comm(no,x1-1,y2,-1,q,2);
  99. no++;ask[no]=comm(no,x2,y1-1,-1,q,2);
  100. }
  101. }
  102. sort(ask+1,ask+1+no);
  103. solve(1,no);
  104. For(i,q) cout<<ans[i]<<endl;
  105. return type==0;
  106. }
  107. int main()
  108. {
  109. //freopen("bzoj1176.in","r",stdin);
  110. int type;
  111. scanf("%d",&type);if (type==3) return 0;
  112. while (work());
  113. //cout<<"END"<<endl;while (1);
  114. return 0;
  115. }

BZOJ 1176([Balkan2007]Mokia-CDQ分治-分治询问)的更多相关文章

  1. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  2. BZOJ 1176[Balkan2007]Mokia(CDQ分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3381  Solved: 1520[Submit][S ...

  3. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  4. BZOJ 1176 [Balkan2007]Mokia ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  5. BZOJ 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2012  Solved: 896[Submit][St ...

  6. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  7. bzoj 1176 [Balkan2007]Mokia 【CDQ分治】

    W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...

  8. BZOJ 1176: [Balkan2007]Mokia KDtree

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...

  9. 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia 链接 分析 三维偏序问题,CDQ分治论文题. 代码 #include<bits/stdc++.h> using namespace std; ...

随机推荐

  1. POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*

    感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...

  2. golang各版本的变化

    https://golang.org/doc/https://golang.org/doc/go1.6https://golang.org/doc/go1.5https://golang.org/do ...

  3. JS的预编译和执行顺序 详析

    原文:JS的预编译和执行顺序 详析 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题   代码:   复制代码 代码一 <ht ...

  4. 译文:前端性能的重要性 The Importance of Frontend Performance

    欢迎訪问我的主页.最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB 在我 ...

  5. JDBC操作数据库的学习(2)

    在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...

  6. [置顶] PMBOOK第四版-ITO与数据流图总结

    具体文档下载地址: 点击打开文档下载地址 :http://download.csdn.net/detail/lyjluandy/6694205 一.过程组与知识领域表(简图) 二.输入 - 工具 - ...

  7. boost::asio网络传输错误码的一些实验结果(recv error_code)

    错误码很重要,可以由此判断网络连接到底发生了神马事情,从而驱动高层逻辑的行为.只有笼统的错误码判断的网络层是不够规范的,鄙人觉得有些错误码还是需要在网络层就区分开的,特此记录一些当前实验的错误码以及发 ...

  8. kgdb调试注意事项

    0    首先提下注意事项的背景:    kgdb和printk共用一个串口 1    设置波特率:    //最高支持460800波特率    arm-eabi-gdb  ./vmlinux    ...

  9. 28.uva 10891 Game of Sum 记忆化dp

    这题和上次的通化邀请赛的那题一样,而且还是简化版本... 那题的题解      请戳这里 ... #include<cstdio> #include<algorithm> #i ...

  10. perl lwp 默认的请求头

    </pre><pre name="code" class="html">[root@dr-mysql01 ~]# cat getx.pl ...