题面

Time Limit: 50 Sec  Memory Limit: 128 MB

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。
解题思路
cdq分治,原问题分为三维:时间,横坐标,纵坐标,之后cdq分治解决时间, 排序解决横坐标,树状数组解决纵坐标,时间复杂度O(nlog^2n)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>using namespace std;
const int MAXN = 500005;
typedef long long LL;inline int rd(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return f?x:-x;
}int n,cnt,Num;
LL f[MAXN],ans[MAXN];struct Query{int x,y,type;int val,id,num;friend bool operator<(const Query A,const Query B){if(A.x!=B.x) return A.x<B.x;if(A.y!=B.y) return A.y<B.y;return A.type<B.type; }
}q[MAXN<<2],tmp[MAXN<<2];void add(int x,int y){for(;x<=n;x+=x&-x) f[x]+=y;
}LL sum(int x){LL ret=0;for(;x;x-=x&-x) ret+=f[x];return ret;
}void Clear(int x){for(;x<=n;x+=x&-x) f[x]=0;
}void cdq(int l,int r){if(l==r) return;int mid=l+r>>1;cdq(l,mid);cdq(mid+1,r);int L=l,R=mid+1,o=0;while(L<=mid && R<=r) {if(q[L]<q[R]) {if(q[L].type==1) add(q[L].y,q[L].val);tmp[++o]=q[L++];}                    else{if(q[R].type==2) ans[q[R].num]+=q[R].val*sum(q[R].y);tmp[++o]=q[R++];}                    }while(L<=mid) tmp[++o]=q[L++];while(R<=r) {if(q[R].type==2) ans[q[R].num]+=q[R].val*sum(q[R].y);tmp[++o]=q[R++];}for(register int i=l;i<=mid;i++) if(q[i].type==1) Clear(q[i].y); for(register int i=1;i<=o;i++) q[i+l-1]=tmp[i];
}int main(){n=rd();int op,x1,x2,y1,y2;while(1){op=rd();if(op==3) break;if(op==1) {q[++cnt].type=op;q[cnt].x=rd();q[cnt].y=rd();q[cnt].val=rd();q[cnt].id=cnt;}else{x1=rd(),y1=rd(),x2=rd(),y2=rd();q[++cnt].type=op;q[cnt].x=x1-1;q[cnt].y=y1-1;q[cnt].val=1;q[cnt].id=cnt;q[cnt].num=++Num;q[++cnt].type=op;q[cnt].x=x1-1;q[cnt].y=y2;q[cnt].val=-1;q[cnt].id=cnt;q[cnt].num=Num;q[++cnt].type=op;q[cnt].x=x2;q[cnt].y=y1-1;q[cnt].val=-1;q[cnt].id=cnt;q[cnt].num=Num;q[++cnt].type=op;q[cnt].x=x2;q[cnt].y=y2;q[cnt].val=1;q[cnt].id=cnt;q[cnt].num=Num;}}
//    cout<<cnt<<endl;
//    for(int i=1;i<=cnt;i++)
//        cout<<q[i].type<<" "<<q[i].x<<" "<<q[i].y<<" "<<q[i].val<<" "<<q[i].id<<" "<<q[i].num<<endl;cdq(1,cnt);for(int i=1;i<=Num;i++) printf("%lld\n",ans[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/sdfzsyq/p/9696336.html

BZOJ 2683: 简单题(CDQ 分治)相关推荐

  1. Bzoj 2683: 简单题(CDQ分治)

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

  2. cdq分治(bzoj 1176: [Balkan2007]Mokia bzoj 2683: 简单题)

    CDQ分治: 本质:对询问进行分治 优点:和莫队分块一样都属于技巧,关键时刻能免去复杂的数据结构,常数小 缺点:必须离线 参考:http://blog.csdn.net/hbhcy98/article ...

  3. BZOJ 4066: 简单题

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MB Submit: 2373  Solved: 622 [Submit][Status][Discuss ...

  4. bzoj 3262: 陌上花开(cdq分治)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2433  Solved: 1087 [Submit][Status][Disc ...

  5. 简单入门CDQ分治(很有意思的算法)

    最近因为牛客暑期多校的一道题涉及到了CDQ分治,于是便去学习了一下CDQ分治. CDQ分治是以曾经的IOI选手陈丹琦命名的一种强大的算法,主要用于解决偏序问题,通过对一维进行排序(在这里说的总维度为二 ...

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

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

  7. bzoj 4237: 稻草人(CDQ分治+单调栈+二分)

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1352  Solved: 594 [Submit][Status][Discus ...

  8. BZOJ 3687 简单题

    3687: 简单题 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1073  Solved: 518 [Submit][Status][Discus ...

  9. BZOJ 2961 共点圆 CDQ分治+凸包

    题目大意:给定平面,多次插入点和圆,每次插入点时询问当前插入的点是否在之前插入的所有圆中并且至少在一个圆中 直接用数据结构维护这些点和圆不是很好写,我们考虑CDQ分治 对于每层分治,我们需要对于[mi ...

  10. bzoj 3687: 简单题

    2333,昨天模拟赛第一题死都想不出怎么优化tarjan,然而正解是一个kora***什么什么的东西,就是正反两遍dfs,然后这个算法求强联通分量的话,是可以用bitset来优化一下的(只考虑点). ...

最新文章

  1. [转载] 中华典故故事(孙刚)——21 正月剪头死舅舅
  2. 行添加DataGridView导出Excel的数据表格
  3. 数据结构--单链表single linked list数据结构C++实现
  4. 信息学奥赛一本通 1924:【03NOIP普及组】栈 | 洛谷 P1044 [NOIP2003 普及组] 栈
  5. 【敏感度,查询,裁剪代码实现】差分隐私代码实现系列(六)
  6. python、java大作战,python测试dubbo接口
  7. jsTree工作笔记001---jsTree的基本使用_js实现树形结构
  8. redis keys 模糊匹配_别找了,你要的Redis命令都在这了
  9. C/C++ 解决sizeof求结构体大小(结构体内存对齐)
  10. 详解大小额支付与超级网银
  11. mathtype中如何添加一个圆圈中间一个减号的符号
  12. [Client]前端代码规范 及 最佳实践
  13. 对称数(自己的算法)
  14. php9宫格抽奖程序_PHP实现抽奖功能实例代码
  15. Sql server日志
  16. Vue知识点整理(三)- Vue脚手架(1)- 初始化Vue脚手架、简单分析Vue脚手架结构
  17. C++实用案例:整数四则运算计算器
  18. 系统试运行报告是谁写的_费控系统项目实施情况说明
  19. 多光谱影像融合--SSVR融合
  20. 【机器学习】支持向量机(Suport Vector Machine)数学推导

热门文章

  1. TestNg测试框架使用
  2. ios手机游戏 带你体验拉斯维加斯的疯狂
  3. HDU 5778 abs
  4. 【设计模式】java设计模式总述及观察者模式
  5. Stereoscopic Player 1.7.4 (SSP) 加载字幕
  6. 让代码在SharePoint页面执行如何在aspx页面中写代码
  7. Win11这个界面你肯定没见过
  8. Spring Cloud 2020 年路线图
  9. 全面了解Nginx主要应用场景
  10. hao123谢幕,那是80后青春的记忆