简单题(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的棋盘,每个格子内有一个整数, ...
随机推荐
- stringstream clear与str("")的问题
一.str与clear函数 C++Reference对于两者的解释: 可见:clear()用来设置错误状态,相当于状态的重置:str用来获取或预置内容 二.区别 运行下面测试代码: #include& ...
- 阿里Java架构师面试高频300题:集合+JVM+Redis+并发+算法+框架等
前言 在过2个月即将进入9月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的java开发朋友跳槽面试,无论一面还是二面,都开始考验一个Java程序员的技术功底和 ...
- QT5:第八章 信号与槽机制
一.简介 QT编程中信号与槽用于处理界面各个组件的交互,类似与MFC的消息循环和绑定 注意:在使用信号与槽的类中,必须在类的定义中加入宏定义Q_OBJECT 信号(Signal)就是在特定情况下被发射 ...
- hibernate4+spring3+struts2搭建框架实例
1.所需要的JAR包 2.web.xml配置文件,这个和平时的配置是一样的 <?xml version="1.0" encoding="UTF-8"?&g ...
- abaqus二次开发概述
说明 abaqus二次开发概述 导语 用户子程序特点 abaqus用户程序接口与调用方式 abaqus用户子程序分类 常用用户子程序介绍 Refence 说明 本系列文章本人基本没有原创贡献,都是在学 ...
- 【树论 倍增】51nod1709 复杂度分析
倍增与位运算有很多共性:这题做法有一点像「线段树上二分」和「线段树套二分」的关系. 给出一棵n个点的树(以1号点为根),定义dep[i]为点i到根路径上点的个数.众所周知,树上最近公共祖先问题可以用倍 ...
- 哪些 Python 库让你相见恨晚?
知乎用户,A European Swallow. 苇叶.Aran He.jerry等人赞同 补充三个有助于自动化日常工作的: sh:sh 1.08 — sh v1.08 documentation可以 ...
- (6)zabbix主机与组配置
1. 创建主机方法 1.1 新建主机configuration(配置)->Hosts(主机)->Create host(创建主机) 见前面的博文 1.2 克隆/完全克隆主机 2. 主机参数 ...
- perl学习之:函数总结
一.进程处理函数 1.进程启动函数 函数名 eval 调用语法 eval(string) 解说 将string看作Perl语句执行.正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息. 例子 ...
- sed快速学习