Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 2142  Solved: 874
[Submit][Status][Discuss]

Description

你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:

命令

参数限制

内容

1 x y A

1<=x,y<=N,A是正整数

将格子x,y里的数字加上A

2 x1 y1 x2 y2

1<=x1<= x2<=N

1<=y1<= y2<=N

输出x1 y1 x2 y2这个矩形内的数字和

3

终止程序

Input

输入文件第一行一个正整数N。
接下来每行一个操作。
 

Output

对于每个2操作,输出一个对应的答案。
 

Sample Input

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

1<=N<=500000,操作数不超过200000个,内存限制20M。
对于100%的数据,操作1中的A不超过2000。

Source

cdq分治裸题。

首先我们对询问点拆为$4$个前缀和查询

再把所有的询问/修改离线,按照$x$轴排序

直接上cdq分治,用树状数组为护$y$轴的贡献

归并排序版太难写了直接上sort

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define lowbit(x) ((x) & (-x))
  4. using namespace std;
  5. const int MAXN = * 1e5 + ;
  6. inline int read() {
  7. char c = getchar(); int x = , f = ;
  8. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  9. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  10. return x * f;
  11. }
  12. int N, Qnum;
  13. struct Query {
  14. int opt, x, y, v, ans, xxx;
  15. bool operator < (const Query &rhs) const {
  16. return x == rhs.x ? y < rhs.y : x < rhs.x;
  17. }
  18. }Q[MAXN], Tp[MAXN];
  19. int T[MAXN];
  20. void Add(int pos, int val) {
  21. for(int i = pos; i <= N; i += lowbit(i)) T[i] += val;
  22. }
  23. int Sum(int pos) {
  24. int ans = ;
  25. for(int i = pos; i; i -= lowbit(i)) ans += T[i];
  26. return ans;
  27. }
  28. int num = , out[MAXN];
  29. void CDQ(int l, int r) {
  30. if(l == r) return ;
  31. int mid = l + r >> ;
  32. CDQ(l, mid);
  33. CDQ(mid + , r);
  34. int i = l, j = mid + , p = l, last = ;
  35. sort(Q + l, Q + mid + );
  36. sort(Q + mid + , Q + r + );
  37. while(j <= r) {
  38. while(Q[i].opt == && i <= mid) i++;
  39. while(Q[j].opt == && j <= r) j++;
  40. if(i <= mid && Q[i].x <= Q[j].x) Add(Q[i].y, Q[i].v), last = i++;
  41. else if(j <= r) Q[j].ans += Sum(Q[j].y), j++;
  42. }
  43. for(int i = l; i <= last; i++)
  44. if(Q[i].opt == )
  45. Add(Q[i].y, -Q[i].v);
  46.  
  47. }
  48. int main() {
  49. N = read();
  50. for(;;) {
  51. int op = read();
  52. if(op == ) break;
  53. if(op == ) {Q[++num].opt = op; Q[num].x = read(), Q[num].y = read(), Q[num].v = read();}
  54. else {
  55. int xx1 = read(), yy1 = read(), xx2 = read(), yy2 = read();
  56. Qnum++;
  57. Q[++num] = (Query) {op, xx2, yy2, , , Qnum};
  58. Q[++num] = (Query) {op, xx1 - , yy1 - , , , Qnum};
  59. Q[++num] = (Query) {op, xx1 - , yy2, , , Qnum};
  60. Q[++num] = (Query) {op, xx2, yy1 - , , , Qnum};
  61. }
  62. }
  63. CDQ(, num);
  64. for(int i = ; i <= num; i++) {
  65. if(Q[i].opt == ) {
  66. if(Q[i].v == || Q[i].v == ) out[Q[i].xxx] += Q[i].ans;
  67. else out[Q[i].xxx] -= Q[i].ans;
  68. }
  69. }
  70. for(int i = ; i <= Qnum; i++)
  71. printf("%d\n", out[i]);
  72. return ;
  73. }

BZOJ2683: 简单题(cdq分治 树状数组)的更多相关文章

  1. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  2. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

  3. BZOJ 1176 Mokia CDQ分治+树状数组

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

  4. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  5. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  6. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  7. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  8. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  9. BZOJ 2683: 简单题(CDQ分治 + 树状数组)

    BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...

随机推荐

  1. thinkphp3.2 删除Runtime目录里的缓存文件,标记一下,以下好找。

    操作如下: utility::clearCache("Data"); 或 utility::clearCache("Data-Logs"); class uti ...

  2. JQ学习总结之选择器

    一.window.onload 和 $(document).ready()区别 1)window.onload   执行时机:必须等待网页中所有的内容加载完毕后(包括图片)才能执行. 编写个数:不能同 ...

  3. 如何在eclipse查看jdk源码(src.zip)

    在eclipse编写代码的过程中,有时候想点进去看看jdk的源码,了解下里面具体的实现.在没有任何配置的情况下,应该是看不到源码的. 其实只需要把jdk安装目录下的src.zip压缩包添加到eclip ...

  4. Html+CSS--->第一周初探

    html css 学了一周的前端,谈谈我的感想 我一直在使用sublime text 3来编辑我的代码,其中有很多很好用的快捷键和插件大大提高了我的开发效率 在这里我极力推荐使用编辑器来进行学习前端. ...

  5. flexbox预习

    创建一个flexbox: .flex-container{ display:flex; } flex-direction:  column;//将flex排成一列 flex-direction: co ...

  6. POS开发问题 - 多个弹出框的实现

    业务场景如下图: 页面出现提示框:    点击确定,隐藏上面的弹出框, 继续弹出提示:  点击确定隐藏上面的弹出框,继续弹出下面提示: 点击确定隐藏上面的弹出框,继续弹出下面提示: 点击确定,跳转页面 ...

  7. Android学习笔记4——Activity详解

    在 Android 开发过程中,与程序员打交道最多的应该就是作为四大组件之一的 Activity 了.接下来我们就一起来揭开 Activity 的神秘面纱吧~ 一.概述 什么是 Activity(活动 ...

  8. 快速排序c语言实现

    #include <stdio.h> void quick_sort(int* a, int n) { ) return; int i,j,tmp,k; k = a[n/]; ,j = n ...

  9. 将Android工程打成jar包之后对资源的调用。

    Android工程不能完整的打包成jar包.这个主要是R文件导致的,但是我们可以将除了资源文件中的所有东西都打到jar包中.Activity.View等等类. 提供jar包的同时,还需要提供资源文件. ...

  10. 《ArcGIS Runtime SDK for Android开发笔记》——(8)、关于ArcGIS Android开发的未来(“Quartz”版Beta)

    1.前言 今天再一次在官网看到了ArcGIS Runtime SDK for Android下一个版本“Quartz”版的更新资料,它将是一个非常重要的更新,包括API接口的重构和开发思路的调整.具体 ...