COGS 577 蝗灾 [CDQ分治入门题]
昨天mhr神犇,讲分治时的CDQ分治的入门题。
题意:
你又一个w*w正方形的田地。
初始时没有蝗虫。
给你两个操作:
1. 1 x y z: (x,y)这个位置多了z只蝗虫。
2. 2 x1 y1 x2 y2: 询问(x1,y1)到(x2,y2)这个矩形内的蝗虫数量。
其中 W<=500000,操作数<=200000 。
题解:
w范围太大,无法使用二维数据结构。
于是我们可以分治操作。
CDQ分治:定义 solve(l,r)
设m=(l+r)/2;
先计算 l…m 修改操作对 m+1…r 查询的影响,然后递归solve(l,m);solve(m+1,r);
solve(x,x)时停止。
这样递归到底后每个询问操作也得到了应该的答案。
有一个好处是在计算l…m 修改操作对 m+1…r 查询的影响时,因为修改都发生在查询之前,那么修改操作之间的顺序就没有那么重要了。
于是可以按x坐标排序,运用扫描线的思想,用一维树状数组解决这个问题。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lowbit(x) ((x)&-(x))
using namespace std;
struct N{
int t,x1,y1,x2,y2,z,num;
};
N Q[];
];
int w,n;
N c[];int cc;
bool cmp(N a,N b){
if(a.x1==b.x1) return a.t<b.t;
return a.x1<b.x1;
}
];
void add(int pos,int a){
while(pos<=w){
tree[pos]+=a;
pos+=lowbit(pos);
}
}
int ask(int pos){
;
){
ret+=tree[pos];
pos-=lowbit(pos);
}
return ret;
}
void solve(int l,int r){
if(l==r) return ;
;
cc=;
for(int i=l;i<=m;i++){
){
c[cc++]=Q[i];
}
}
;i<=r;i++){
if(Q[i].t){
c[cc++]=Q[i];
c[cc++]=Q[i];
c[cc-].x1--;
c[cc-].x1=c[cc-].x2;
c[cc-].t=;
}
}
sort(c,c+cc,cmp);
;i<cc;i++){
){
add(c[i].y1,c[i].z);
}){
ans[c[i].num]-=ask(c[i].y2)-ask(c[i].y1-);
}else{
ans[c[i].num]+=ask(c[i].y2)-ask(c[i].y1-);
}
}
;i<cc;i++){
){
add(c[i].y1,-c[i].z);
}
}
solve(l,m);solve(m+,r);
}
int main(){
freopen("locust.in","r",stdin);
freopen("locust.out","w",stdout);
scanf("%d%d",&w,&n);
,x1,y1,x2,y2;i<=n;i++){
Q[i].num=i;
scanf("%d",&Q[i].t);
Q[i].t--;
){
scanf("%d%d%d",&Q[i].x1,&Q[i].y1,&Q[i].z);
}else{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
Q[i].x1=min(x1,x2);
Q[i].x2=max(x1,x2);
Q[i].y1=min(y1,y2);
Q[i].y2=max(y1,y2);
}
}
solve(,n);
;i<=n;i++){
if(Q[i].t) printf("%d\n",ans[i]);
}
;
}
COGS 577 蝗灾 [CDQ分治入门题]的更多相关文章
- cogs 577 蝗灾 CDQ分治
第一道CDQ,抄了下helenkeller的代码,感觉和归并排序差不多... 因为左半边的修改肯定在右半边的询问之前,所以就不用管时间的限制了,可以直接x轴排序树状数组处理y轴... #include ...
- bzoj3262陌上花开 cdq分治入门题
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- CDQ分治入门 + 例题 Arnooks's Defensive Line [Uva live 5871]
CDQ分治入门 简介 CDQ分治是一种特别的分治方法,它由CDQ(陈丹琦)神犇于09国家集训队作业中首次提出,因此得名.CDQ分治属于分治的一种.它一般只能处理非强制在线的问题,除此之外这个算法作为某 ...
- COGS 577 蝗灾 线段树+CDQ分治
第一次写cdq分治 感谢hhd<y 这20亿对CP的指导(逃) 其实 就是 递归看左半部分对右半部分的贡献 (树状数组写挂了--临时改的线段树[大写的尴尬]) //By SiriusRen ...
- cdq分治入门学习 cogs 1752 Mokia nwerc 2015-2016 G 二维偏序
/* CDQ分治的对象是时间. 即对于一个时间段[L, R],我们取mid = (L + R) / 2. 分治的每层只考虑mid之前的修改对mid之后的查询的贡献,然后递归到[L,mid],(mid, ...
- COGS 577 蝗灾
传送门 时间限制:2 s 内存限制:128 MB DESCRIPTION C国国土辽阔,地大物博......但是最近却在闹蝗灾..... 我们可以把C国国土当成一个W×W的矩阵,你会收到一些诸如(X, ...
- cdq分治入门and持续学习orz
感觉cdq分治是一个很有趣的算法 能将很多需要套数据结构的题通过离线来做 目前的一些微小的理解 在一般情况下 就像求三维偏序xyz 就可以先对x排序 然后分治 1 cdq_x(L,M) ; 2 提取出 ...
- CDQ分治入门
前言 \(CDQ\)分治是一个神奇的算法. 它有着广泛的用途,甚至在某些题目中还能取代\(KD-Tree\).树套树等恶心的数据结构成为正解,而且常数还小得多. 不过它也有一定的缺点,如必须离线操作, ...
- caioj1097: [视频]树状数组1(快速求和计算) cdq分治入门
这题虽然是个树状数组,但是也可以用cdq分治做啊~~,这个就是一个浅显的二维偏序的应用? cdq分治和普通的分治有什么区别? 举个栗子:有4个小朋友,你请他们吃饭,假如你分治搞,就会分成很多子问题—— ...
随机推荐
- file is missing from source location:c\temp\batang.ttc
打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink 在右侧找到 Micr ...
- jqery选择器
根据可见性 属性 匹配元素 <!doctype html> <html lang="en"> <head> <meta charset=& ...
- OnePlus One(一加1)刷机Kali Nethunter完整教程
设备信息: 设备名称:OnePlus One(一加1) OS:ColorOS 1.2 设备型号:A0001 目标: 在OnePlus One(一加1)上将 ColorOS 1.2 刷机为 Kali N ...
- android测试分析1
Android测试框架,开发环境中集成的一部分,提供一个架构和强有力的工具 可以帮助测试你的应用从单元到框架的每个方面. 测试框架有这些主要特征: 1.Android测试组件基于Junit.你可以使用 ...
- android线程池ThreadPoolExecutor的理解
android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...
- Angularjs总结(八)$ cookie和$rootscope
AngularJS 提供了很好的 $cookie 和 $cookieStore API 用来处理 cookies .这两个服务都能够很好的发挥HTML5 cookies,当HTML5 API可用时浏览 ...
- Javascript 数组自定义排序,并获取排序后的保存原索引的同序数组(堆排序实现)
比如数组A: [ 0: 5, 1: 2, 2: 4, 3: 3, 4: 1 ] 排序后的结果为:[1, 2, 3, 4, 5],但是有时候会有需求想要保留排序前的位置到一个同位数组里,如前例则为:[4 ...
- Java实战之01Struts2-02配置文件
三.Struts2的配置文件 1.加载时机: 当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了. 2.加载顺序 顺序 配置文件名 所在位置 说明 1 default.prope ...
- foreach的一点理解
首先什么样的数据才能实现foreach 1 实现IEnumerable这个接口 2 有GetEnumerable()这个方法 然后为啥实现这个接口或者有这个方法就可以实现foreach遍历 首先我先用 ...
- Linux 下如何使用看门狗
Linux内核有集成WD的选项.将其使能后,系统里就会有watchdog的设备驱动:/dev/watchdog.这样,在应用程序里只需打开这个设备使用即可:#include <fcntl.h ...