简单题(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的棋盘,每个格子内有一个整数, ...
随机推荐
- codevs 3278 最小m 段和问题
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定 n 个整数(不一定是正整数)组成的序列,现在要求将序列分割为 m 段,每段 ...
- Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题
Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题 1.首先,要单击右上角的设置输入法的"区域与语言设置",要设置为“为每个窗口设置不同的输入源”. 还有,刚使用的 ...
- PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)
PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...
- JdbcTemplate类对sql的操作使用
<!--方式一: dbcp 数据源配置,在测试环境使用单连接 --> <bean id="dataSource" class="org.apache.c ...
- shell脚本,tee小工具的用法。
解释: tee是个工具 , 它的作用就是把标准输出,复制一份,扔文件里 ,原标准输出还输出,-a就相当于 >> 追加到文件里的意思. 不加就是 > 重定向到文件里去.
- shell脚本,通过传参求斐波那契数列如(0,1,1,2,3,5,8,13..........)
[root@localhost wyb]# cat fibo.sh #!/bin/bash #斐波那契数列 ,,,,,,, > file >> file count=$ for i ...
- Lucene入门基础教程
http://www.linuxidc.com/Linux/2014-06/102856.htm
- iOS开发遇到的坑之四--图片命名不规范
最近上手并主导一个小项目的研发,在开发地图模块的时候,UI切图给我们使用,他给的图片命名是1.1.1.png 1.1.2.png 1.1.3.png 我也没有多看,就直接打包发给小组成员叫他添加到Im ...
- mac拷贝原版和权限修复的命令行工具
建议直接从安装盘中用命令复制,因为上传的kext权限会变,导致签名失败. 假定安装盘盘符是install_osx: sudo cp -R /Volumes/install_osx/S*/L*/E*/A ...
- kvm虚拟迁移
1. 虚拟迁移 迁移: 系统的迁移是指把源主机上的操作系统和应用程序移动到目的主机,并且能够在目的主机上正常运行.在没有虚拟机的时代,物理机之间的迁移依靠的是系统备份和恢复技术.在源主机上实时备份操作 ...