BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 3381 Solved: 1520
[Submit][Status][Discuss]
Description
维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.
Input
第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小
接下来每行为一下三种输入之一(不包含引号):
"1 x y a"
"2 x1 y1 x2 y2"
"3"
输入1:你需要把(x,y)(第x行第y列)的格子权值增加a
输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,并输出
输入3:表示输入结束
Output
对于每个输入2,输出一行,即输入2的答案
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
题解
首先这个s是假的,把它忽视掉。
天啊,昨天打CDQ分治打得太嗨了,就忘了更新博客了。
说真的,CDQ分治是真的好打,基本上除了开始几道都是1A
这题是个三维偏序裸题。。。
第一维排序,然后第二维CDQ分治,然后以第三维造树状数组。。。
具体看代码。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int s,n,tr[N],cnt,tot,ans[N];
struct query{
int id,k,w,x,y;
bool operator <(const query &a)const{
if(a.id==id){
if(a.x==x){
if(a.y==y){
return a.k>k;
}
else return a.y>y;
}
else return a.x>x;
}
else return a.id>id;
}
}q[N],c[N];
bool pd(query a,query b){
if(a.x==b.x){
if(a.y==b.y){
return a.k<b.k;
}
else return a.y<b.y;
}
else return a.x<b.x;
}
int lowbit(int x){
return x&-x;
}
void add(int x,int w){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]+=w;
}
}
int getsum(int x){
int ans=;
for(int i=x;i>=;i-=lowbit(i)){
ans+=tr[i];
}
return ans;
}
void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>;
cdq(l,mid);cdq(mid+,r);
int ll=l;int rl=mid+;int now=;
while(ll<=mid&&rl<=r){
if(pd(q[ll],q[rl])){
if(q[ll].k==)add(q[ll].y,q[ll].w);
c[++now]=q[ll++];
}
else{
if(q[rl].k==)ans[q[rl].w]-=getsum(q[rl].y);
else if(q[rl].k==)ans[q[rl].w]+=getsum(q[rl].y);
c[++now]=q[rl++];
}
}
while(ll<=mid){
if(q[ll].k==)add(q[ll].y,q[ll].w);
c[++now]=q[ll++];
}
while(rl<=r){
if(q[rl].k==)ans[q[rl].w]-=getsum(q[rl].y);
else if(q[rl].k==)ans[q[rl].w]+=getsum(q[rl].y);
c[++now]=q[rl++];
}
for(int i=l;i<=mid;i++){
if(q[i].k==)add(q[i].y,-q[i].w);
}
for(int i=l;i<=r;i++){
q[i]=c[i-l+];
}
}
int main(){
scanf("%d%d",&s,&n);
n+=;
while(){
int k;
scanf("%d",&k);
if(k==){
int x,y,a;
scanf("%d%d%d",&x,&y,&a);
x+=;y+=;
q[++cnt].x=x;q[cnt].y=y;
q[cnt].id=cnt;q[cnt].k=;
q[cnt].w=a;
}
else if(k==){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1+=;y1+=;x2+=;y2+=;
q[++cnt].x=x2;q[cnt].y=y2;q[cnt].id=cnt;q[cnt].k=;q[cnt].w=++tot;
q[++cnt].x=x1-;q[cnt].y=y2;q[cnt].id=cnt;q[cnt].k=;q[cnt].w=tot;
q[++cnt].x=x2;q[cnt].y=y1-;q[cnt].id=cnt;q[cnt].k=;q[cnt].w=tot;
q[++cnt].x=x1-;q[cnt].y=y1-;q[cnt].id=cnt;q[cnt].k=;q[cnt].w=tot;
}
else break;
}
sort(q+,q++cnt);
// for(int i=1;i<=cnt;i++){
// cout<<q[i].id<<" "<<q[i].x<<" "<<q[i].y<<" "<<q[i].k<<" "<<q[i].w<<endl;;
// }
cdq(,cnt);
for(int i=;i<=tot;i++){
printf("%d\n",ans[i]);
}
return ;
}
BZOJ 1176[Balkan2007]Mokia(CDQ分治)的更多相关文章
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
- BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
[题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...
- BZOJ 1176: [Balkan2007]Mokia
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2012 Solved: 896[Submit][St ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- bzoj 1176 [Balkan2007]Mokia 【CDQ分治】
W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...
- BZOJ1176: [Balkan2007]Mokia CDQ分治
最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...
- BZOJ 1176: [Balkan2007]Mokia KDtree
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
随机推荐
- 时域,频域,s域和z域,一些网上的总结
https://www.jianshu.com/p/29f4a7663b14 https://wenku.baidu.com/view/26961183b9d528ea81c779e0.html ht ...
- python下py2exe打包笔记
1.下载与python版本一致的py2exe插件包 2.安装py2exe,安装后在python目录下存在:\Lib\site-packages\py2exe\... 3.新建一个python脚本文件, ...
- 【参考】Linux下的Memcache安装
服务器端主要是安装memcache服务器端.下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz另外,Memcache用到了lib ...
- hiho 1572 - set.upper_bound,排序树
链接 小Hi家的阳台上摆着一排N个空花盆,编号1~N.从第一天开始,小Hi每天会选择其中一个还空着花盆,栽种一株月季花,直到N个花盆都栽种满月季. 我们知道小Hi每天选择的花盆的编号依次是A1, A2 ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...
- (转)String StringBuilder StringBuffer 对比 总结得非常好
来源:http://blog.csdn.net/clam_clam/article/details/6831345 转自:http://www.iteye.com/topic/522167 作者:每次 ...
- SKU和SPU表的设计
1.什么是SKU,SPU SKU:Stock Keeping Unit (库存量单位)SKU即库存进出计量的单位,可以是以件.盒.托盘等为单位,是物理上不可分割的最小存货单元.在使用时要根据不同业态, ...
- spring boot ---web应用开发-错误处理
一.错误的处理 方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = &qu ...
- 关于iptables允许samba的问题
今天同事跟我说他们部门的共享不能用了,想了想,最近变更的只有iptables,于是看看是否是这个原因,发现没有允许samba的入站和出站规则,我的iptables规则默认是所有都drop的,但是不知确 ...
- win10 64位下VirtualBox安装CentOS6.9
第一步:安装VritualBox 百度“VritualBox”下载安装即可: 第二步:下载Linux镜像系统并安装 这里写出我参照的博客,很详细,我就不累赘了! 原文地址:http://blog.cs ...