简单题(bzoj 1683)
Description
|
命令 |
参数限制 |
内容 |
|
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
Output
Sample Input
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
Sample Output
5
HINT
/*
第一次写cdq分治,先看了2013年集训队作业中许昊然的论文,有了一点初步理解,然后又做这个题,
感觉对cdq分治的大概思路有了一定认识。 cdq分治要求可离线,并且各个修改操作之间互不影响,且对查询操作的贡献独立。
我们考虑将操作分治,那么后一般操作中的修改是独立的,查询至于前一半的所有修改和后一般在它时间之前的修改有关,
对于前一半修改可以预处理,对于后一半在它之前的,可以递归处理。 这个题目的数据范围二维数据结构是不好过的,所以可以考虑将某一维排序,然后用一位数据结构维护。
我们用前缀和的思想,将求和操作理解为四个单点查询操作,然后对于每个查询操作x,y,对他有贡献的修改操作
一定是时间在它之前的并且x比它小的,所以我们可以按照x坐标排序,然后用树状数组维护y坐标的值。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 800010
using namespace std;
int n,tot,T,ans[N],tree[N];
struct node{
int op,x,y,A,no,belong;
};node Q[N],tq[N];
bool cmp(const node&s1,const node&s2){
if(s1.x==s2.x&&s1.y==s2.y) return s1.op<s2.op;
if(s1.x==s2.x) return s1.y<s2.y;
return s1.x<s2.x;
}
void modify(int x,int v){
while(x<=n){
tree[x]+=v;
x+=x&(-x);
}
}
int query(int x){
int sum=;
while(x){
sum+=tree[x];
x-=x&(-x);
}
return sum;
}
void solve(int l,int r){
if(l==r)return;
int mid=l+r>>;
for(int i=l;i<=r;i++)
if(Q[i].no<=mid&&Q[i].op==) modify(Q[i].y,Q[i].A);
else if(Q[i].no>mid&&Q[i].op==){
if(Q[i].A) ans[Q[i].belong]+=query(Q[i].y);
else ans[Q[i].belong]-=query(Q[i].y);
}
for(int i=l;i<=r;i++)
if(Q[i].no<=mid&&Q[i].op==) modify(Q[i].y,-Q[i].A);
int l1=l,l2=mid+;
for(int i=l;i<=r;i++)
if(Q[i].no<=mid)tq[l1++]=Q[i];
else tq[l2++]=Q[i];
for(int i=l;i<=r;i++)
Q[i]=tq[i];
solve(l,mid);solve(mid+,r);
}
int main(){
scanf("%d",&n);
int opt,x,y,v,x1,y1;
while(){
scanf("%d",&opt);
if(opt==){
scanf("%d%d%d",&x,&y,&v);
Q[++tot].op=;Q[tot].x=x;Q[tot].y=y;Q[tot].A=v;Q[tot].no=tot;
}
else if(opt==){
scanf("%d%d%d%d",&x,&y,&x1,&y1);
Q[++tot].op=;Q[tot].x=x-;Q[tot].y=y-;Q[tot].A=;Q[tot].no=tot;Q[tot].belong=++T;
Q[++tot].op=;Q[tot].x=x-;Q[tot].y=y1;Q[tot].A=;Q[tot].no=tot;Q[tot].belong=T;
Q[++tot].op=;Q[tot].x=x1;Q[tot].y=y-;Q[tot].A=;Q[tot].no=tot;Q[tot].belong=T;
Q[++tot].op=;Q[tot].x=x1;Q[tot].y=y1;Q[tot].A=;Q[tot].no=tot;Q[tot].belong=T;
}
else break;
}
sort(Q+,Q+tot+,cmp);
solve(,tot);
for(int i=;i<=T;i++)
printf("%d\n",ans[i]);
return ;
}
简单题(bzoj 1683)的更多相关文章
- 【BZOJ】【4066】简单题(强制在线)
KD-Tree KD-Tree的进阶姿势戳这里 http://zyfzyf.is-programmer.com/posts/92431.html 为啥有种线段树&平衡树的即视感……(树形结构的 ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- BZOJ 3687: 简单题 bitset
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- 【BZOJ4066】简单题(KD-Tree)
[BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...
- bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- Bzoj2683 简单题
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1071 Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...
随机推荐
- ucosii(2.89)mbox 应用要点
OSMboxCreate(void *msg) 当创建一个mbox时候,消息邮箱允许(任务或者中断)向其他一个或者几个任务发送消息.初始化msg指向消息邮箱中的消息. void*OSMboxP ...
- 爬虫_python3_requests_2
pip install requests 进行简单的操作 发送一个get请求 # 发送请求 import requests response = requests.get('http://httpbi ...
- C#编写高并发数据库控制
往往大数据量,高并发时, 瓶颈都在数据库上, 好多人都说用数据库的复制,发布, 读写分离等技术, 但主从数据库之间同步时间有延迟.代码的作用在于保证在上端缓存服务失效(一般来说概率比较低)时,形成倒瓶 ...
- Python 输入输出 数据类型 变量
python输入输出 数据类型 变量 输入输出 print()在Python3中是函数 >>>print('hello world') #print注意print前面不要有任何空格 ...
- spring中常用的注解
使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...
- Spring Boot + Mybatis + Druid 动态切换多数据源
在大型应用程序中,配置主从数据库并使用读写分离是常见的设计模式. 在Spring应用程序中,要实现读写分离,最好不要对现有代码进行改动,而是在底层透明地支持. 这样,就需要我们再一个项目中,配置两个, ...
- RuntimeError: Failed to init API, possibly an invalid tessdata path: E:\python36\报错
OCR:光学识别符,tesserocr是python中一个OCR识别库,是对tesseract做的一个python的 API封装,所以它的核心是tesseract 在这里我安装的版本是:tessera ...
- Springboot(一)-IDEA搭建springboot项目(demo)
jdk版本:1.8.0_162 1.打开IDEA-file-new-project-Spring Initializer,JDK和URL选默认,next (这一步如果是不能联网的话,可以选择直接创建m ...
- find 命令search使用
GNU在目录树中查找的时候,是根据所给的名字从根节点开始从左到右匹配.根据优先级规则,直到在某一个节点找到结果了才会移动到下一个文件名字. 1.找空目录 find ./path -depth -ty ...
- Python9-反射-day27(大年初三)
复习 class 类名(父类,父类2): 静态属性 = '' #静态属性 类属性 def __init__(self): #初始化方法 self.name = 'alex' def func(self ...