[BOI2007]摩基亚Mokia (cdq分治)
2016-07-01 21:37
447 查看
摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。
在定位系统中,世界被认为是一个W×W的正方形区域,由1×1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4×4的正方形,就有1<=x<=4,1<=y<=4(如图):
请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用户。
【输入格式】
有三种命令,意义如下:
命令 参数 意义
0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
1 x y A 向方格(x,y)中添加A个用户。A是正整数。
2 X1 Y1 X2 Y2 查询X1<=x<=X2,Y1<=y<=Y2所规定的矩形中的用户数量
3 无参数 结束程序。本命令仅结束时出现一次。
就是一个二维的单点修改,然后查询矩阵中的和,但是这题就是范围很大,w的范围有200W,这很难用二维线段树啊树状数组的来维护
所以这里要用cdq分治来解决这个问题。
cdq分治的一些原理可以看这个blog
http://blog.csdn.net/greatwall1995/article/details/8789394
能用cdq分治的问题有如下要求:
1.修改操作对询问的贡献独立,修改操作互不影响效果。
2.题目允许使用离线算法。
具体算法流程如下:
1.将整个操作序列分为两个长度相等的部分(分)
2.递归处理前一部分的子问题(治1)
3.计算前一部分的子问题中的修改操作对后一部分子问题的影响(治2)
4.递归处理后一部分子问题(治3)
2,3,4步骤的顺序没有影响,最重要的是第三步
这题的话就可以先分治,然后求区间[l,m]内的修改对区间[m+1,r]区间内询问的贡献。具体的可以用树状数组来维护,类似维护扫描线一样
代码:
在定位系统中,世界被认为是一个W×W的正方形区域,由1×1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4×4的正方形,就有1<=x<=4,1<=y<=4(如图):
请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用户。
【输入格式】
有三种命令,意义如下:
命令 参数 意义
0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
1 x y A 向方格(x,y)中添加A个用户。A是正整数。
2 X1 Y1 X2 Y2 查询X1<=x<=X2,Y1<=y<=Y2所规定的矩形中的用户数量
3 无参数 结束程序。本命令仅结束时出现一次。
就是一个二维的单点修改,然后查询矩阵中的和,但是这题就是范围很大,w的范围有200W,这很难用二维线段树啊树状数组的来维护
所以这里要用cdq分治来解决这个问题。
cdq分治的一些原理可以看这个blog
http://blog.csdn.net/greatwall1995/article/details/8789394
能用cdq分治的问题有如下要求:
1.修改操作对询问的贡献独立,修改操作互不影响效果。
2.题目允许使用离线算法。
具体算法流程如下:
1.将整个操作序列分为两个长度相等的部分(分)
2.递归处理前一部分的子问题(治1)
3.计算前一部分的子问题中的修改操作对后一部分子问题的影响(治2)
4.递归处理后一部分子问题(治3)
2,3,4步骤的顺序没有影响,最重要的是第三步
这题的话就可以先分治,然后求区间[l,m]内的修改对区间[m+1,r]区间内询问的贡献。具体的可以用树状数组来维护,类似维护扫描线一样
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; #define MAX 200005 #define MAXN 6005 #define maxnode 15 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); //const double inf = 1e18; const double eps = 1e-8; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ struct que{ int op,id,x1,y1,x2,y2; bool operator < (const que&x)const{ if(x1==x.x1) return op<x.op; return x1<x.x1; } }q[MAX],a[MAX]; int ans[MAX]; int c[MAX*10]; int n; void add(int x,int d){ while(x<=n){ c[x]+=d; x+=lowbit(x); } } int sum(int x){ int ret=0; while(x){ ret+=c[x]; x-=lowbit(x); } return ret; } void cdq(int l,int r){ int mid=(l+r)/2; if(l>=r) return; cdq(l,mid);cdq(mid+1,r); int cnt=0; for(int i=l;i<=mid;i++){ if(q[i].op==1) a[cnt++]=q[i]; } for(int i=mid+1;i<=r;i++){ if(q[i].op==2){ a[cnt++]=q[i]; a[cnt-1].op=0; a[cnt++]=q[i]; a[cnt-1].op=2; a[cnt-1].x1=q[i].x2; } } sort(a,a+cnt); for(int i=0;i<cnt;i++){ if(a[i].op==0){ ans[a[i].id]-=(sum(a[i].y2)-sum(a[i].y1-1)); } else if(a[i].op==1) add(a[i].y1,a[i].x2); else{ ans[a[i].id]+=(sum(a[i].y2)-sum(a[i].y1-1)); } } } int main(){ freopen("mokia.in","r",stdin); freopen("mokia.out","w",stdout); int s,op; scanf("%d%d",&s,&n); int cnt=0; int tot=0; mem(ans,0);mem(c,0); while(scanf("%d",&op)&&op!=3){ if(op==1){ int x,y,z; scanf("%d%d%d",&x,&y,&z); q[++cnt]=(que){op,-1,x,y,z,0}; } else{ int u,v,x,y; scanf("%d%d%d%d",&u,&v,&x,&y); q[++cnt]=(que){op,++tot,u,v,x,y}; } } cdq(1,cnt); for(int i=1;i<=tot;i++){ printf("%d\n",ans[i]); } return 0; }
相关文章推荐
- 关于FileOutputStream
- centos6.6简单搭建git服务端
- Python super继承详解
- 文件操作
- HDU 5706 DFS水题 (以及关于Steam的吐槽...)
- java stoi
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
- 《Java小游戏实现》:贪吃蛇
- 转:非构造函数的继承
- 表格、表单操作
- windows8 本地解析和切换到超级管理员账户下编辑该文件
- adesigner 7-1
- Python 3.5 安装
- Mybatis基础学习(二)—开发Dao方式
- iOS开发 SDWebImage中那些好用的方法
- win7 -- 常见命令
- 欢迎使用CSDN-markdown编辑器
- hdu5288(思维+分解因子)
- ButtonRequest(主类)以及Button类
- microstation level3 03