COGS 577 蝗灾 线段树+CDQ分治
第一次写cdq分治 感谢hhd<y 这20亿对CP的指导(逃)
其实 就是 递归看左半部分对右半部分的贡献
(树状数组写挂了……临时改的线段树【大写的尴尬】)
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 666666
int w,n,tree[N*16];
struct Oper{int op,id,x1,y1,x2,y2,z,ans;}a[N],b[N];
bool cmp(Oper a,Oper b){return a.x1<b.x1||(a.x1==b.x1&&a.op<b.op);}
void add(int l,int r,int pos,int num,int wei){
if(l==r){tree[pos]+=wei;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<num)add(mid+1,r,rson,num,wei);
else add(l,mid,lson,num,wei);
tree[pos]=tree[lson]+tree[rson];
}
int query(int l,int r,int pos,int num){
if(num>=r)return tree[pos];
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid>=num)return query(l,mid,lson,num);
else return query(l,mid,lson,num)+query(mid+1,r,rson,num);
}
void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>1,cnt=0;
cdq(l,mid),cdq(mid+1,r);
for(int i=l;i<=mid;i++)if(a[i].op==1)b[cnt++]=a[i];
for(int i=mid+1;i<=r;i++)if(a[i].op==2){
b[cnt]=a[i],b[cnt++].x1--;
b[cnt]=a[i],b[cnt].x1=a[i].x2;b[cnt++].op=3;
}
sort(b,b+cnt,cmp);
for(int i=0;i<cnt;i++)
if(b[i].op==1)add(0,w,1,b[i].y1,b[i].z);
else a[b[i].id].ans+=((b[i].op == 2)?-1:1)*(query(0,w,1,b[i].y2)-query(0,w,1,b[i].y1-1));
for(int i=0;i<cnt;i++)if(b[i].op==1)add(0,w,1,b[i].y1,-b[i].z);
}
int main(){
freopen("locust.in","r",stdin);
freopen("locust.out","w",stdout);
scanf("%d%d",&w,&n);
for(int i=1;i<=n;a[i].id=i,i++){
scanf("%d%d%d",&a[i].op,&a[i].x1,&a[i].y1);
if(a[i].op==1)scanf("%d",&a[i].z);
else scanf("%d%d",&a[i].x2,&a[i].y2);
}cdq(1,n);
for(int i=1;i<=n;i++)if(a[i].op==2)printf("%d\n",a[i].ans);
}
COGS 577 蝗灾 线段树+CDQ分治的更多相关文章
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
- BZOJ 3939 [Usaco2015 Feb]Cow Hopscotch ——线段树 CDQ分治
显然dp[i][j]=ps[i-1][j-1]-sigma(dp[k<i][l<j],a[i][j]=a[k][l]) 考虑对于每一种颜色都开一颗区间线段树,但是空间不够. 所以我们可以动 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- COGS 577 蝗灾 [CDQ分治入门题]
题目链接 昨天mhr神犇,讲分治时的CDQ分治的入门题. 题意: 你又一个w*w正方形的田地. 初始时没有蝗虫. 给你两个操作: 1. 1 x y z: (x,y)这个位置多了z只蝗虫. 2. 2 x ...
- 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治
LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...
- COGS 577 蝗灾
传送门 时间限制:2 s 内存限制:128 MB DESCRIPTION C国国土辽阔,地大物博......但是最近却在闹蝗灾..... 我们可以把C国国土当成一个W×W的矩阵,你会收到一些诸如(X, ...
- bzoj 3295 (洛谷3157、3193) [Cqoi2011]动态逆序对——树套树 / CDQ分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 题目--洛谷3157:https://www.luogu.org/problemnew ...
- Codechef-ANCESTOR(树套树/CDQ分治)
题意: 给定两棵有根树,各有 N 个点.两棵树上的点分别被从 1 到 N 标号.两棵树的根均为标号为 1 的节点. 你的任务非常简单:对于每个 i,找到一个 j(j != i),使得在两棵树中 j 都 ...
- 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)
[题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...
随机推荐
- P1064 金明的预算方案 (依赖性背包问题)
这道题可以用分组背包来做. 但是分组有两种方式 一种是把主件,主件+附件1,主件+附件2分成一组 组内只能选一个物品 一种是建一颗树,用树形dp的方式去做 第二种更通用,就算物品的依赖关系是森林都可以 ...
- 第一个JavaWeb工程
这个工程主要用来研究log4j,所以就只有一个页面,希望以后慢慢进步. java动态生成网页主要使用servlet.把请求拦截下来,处理后返回结果. 这里创建的是一个maven工程. 结构如下:
- Gitlab command line instructions
Git global setup git config --global user.name "winner" git config --global user.email &qu ...
- inux 虚拟机桥接模式 静态ip设置,桥接才是王道
修改/etc/sysconfig/network-scripts 目录下的 ifcfg-eth0 [root@yangcb network-scripts]# cat ifcfg-eth0 DEVI ...
- 50个经典Sql语句
50个经典Sql语句 --1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Cours ...
- jackson 解析json含有不规则的属性的json字符串的方法
对于json中含有点号,等其它特殊的,不是规范的java变量名的字符,能够使用一个注解来处理. 贴代码: import com.fasterxml.jackson.annotation.JsonPro ...
- cocos2dx下的A星算法
这是我依据这篇博文http://hi.baidu.com/wsapyoemdfacmqr/item/bdfb5c0a74c904d01ef0466d.来在cocos2dx上编写.这是终于的效果图: 红 ...
- pchip和spline差别
- MFC中CFileDialog使用方法
用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址.和王工调试了半天,怎么跟踪也没发现错误,原来如此. .... .. . . CFileDialog ...
- zzulioj--1827--石锅全拌(区间求和水题)
1827: 石锅全拌 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 6 Solved: 3 SubmitStatusWeb Board Descri ...