COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的:
摩尔瓦多的移动电话公司摩基亚(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 无参数 结束程序。本命令仅结束时出现一次。
这篇题解写得挺详细的:http://wulala.logdown.com/posts/207262-boi-2007-mokia。
。。然后感觉这题转化成二维前缀和的差分挺厉害的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; long long tree[<<];
int N,x,y;
void update(int i,int j,int k){
if(i==j){
tree[k]+=y;
return;
}
int mid=i+j>>;
if(x<=mid) update(i,mid,k<<);
else update(mid+,j,k<<|);
tree[k]=tree[k<<]+tree[k<<|];
}
long long query(int i,int j,int k){
if(x>y) return ;
if(x<=i && j<=y){
return tree[k];
}
int mid=i+j>>;
long long res=;
if(x<=mid) res+=query(i,mid,k<<);
if(y>mid) res+=query(mid+,j,k<<|);
return res;
} struct Query{
int idx,type,anspos;
int x,y,A;
bool operator<(const Query &q) const {
return x<q.x;
}
}que[],tmp[]; long long ans[]; void cdq(int l,int r){
if(l>=r) return;
int mid=l+r>>,i=l,j=mid+;
for(int k=l; k<=r; ++k){
if(que[k].idx<=mid) tmp[i++]=que[k];
else tmp[j++]=que[k];
}
for(int k=l; k<=r; ++k){
que[k]=tmp[k];
} for(i=mid+,j=l; i<=r; ++i){
if(que[i].type==) continue;
for( ; j<=mid && que[j].x<=que[i].x; ++j){
if(que[j].type==) continue;
x=que[j].y; y=que[j].A;
update(,N,);
}
x=; y=que[i].y;
ans[que[i].anspos]+=query(,N,)*que[i].A;
} for(int i=l; i<j; ++i){
if(que[i].type==) continue;
x=que[i].y; y=-que[i].A;
update(,N,);
} cdq(l,mid); cdq(mid+,r);
} int main(){
//freopen("mokia.in","r",stdin); freopen("mokia.out","w",stdout); int op,n,a,b,c,d;
scanf("%d%d",&op,&n);
int opn=,cnt=;
while(scanf("%d",&op),op!=){
if(op==){
scanf("%d%d%d",&a,&b,&c);
que[++opn].idx=opn; que[opn].type=; que[opn].x=a; que[opn].y=b; que[opn].A=c;
}else if(op==){
scanf("%d%d%d%d",&a,&b,&c,&d);
++cnt;
que[++opn].idx=opn; que[opn].type=; que[opn].anspos=cnt; que[opn].x=c; que[opn].y=d; que[opn].A=;
que[++opn].idx=opn; que[opn].type=; que[opn].anspos=cnt; que[opn].x=c; que[opn].y=b-; que[opn].A=-;
que[++opn].idx=opn; que[opn].type=; que[opn].anspos=cnt; que[opn].x=a-; que[opn].y=d; que[opn].A=-;
que[++opn].idx=opn; que[opn].type=; que[opn].anspos=cnt; que[opn].x=a-; que[opn].y=b-; que[opn].A=;
}
} for(N=; N<n; N<<=); sort(que+,que++opn);
cdq(,opn); for(int i=; i<=cnt; ++i){
printf("%lld\n",ans[i]);
}
return ;
}
COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)的更多相关文章
- COGS1752. [BOI2007]摩基亚Mokia CDQ
		CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ... 
- COGS1752. [BOI2007]摩基亚Mokia
		1752. [BOI2007]摩基亚Mokia ★★☆ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ... 
- COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)
		题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ... 
- COJS 1752. [BOI2007]摩基亚Mokia
		1752. [BOI2007]摩基亚Mokia ★★★ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ... 
- 分治(CDQ):[BOI2007]摩基亚Mokia
		[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ... 
- Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
		题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ... 
- [BOI2007]Mokia 摩基亚(CDQ分治)
		upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ... 
- 【COGS1752】 BOI2007—摩基亚Mokia
		http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ... 
- P4390 [BOI2007]Mokia 摩基亚(cdq分治)
		一样是cdq的板子 照着园丁的烦恼就好了 代码 #include <cstdio> #include <cstring> #include <algorithm> ... 
随机推荐
- SQLServer触发器
			触发器的作用: 自动化操作,减少了手动操作以及出错的几率. 触发器是一种特殊类型的存储过程,它不同于前面介绍过的一般的存储过程. [在SQL内部把触发器看做是存储过程但是不能传递参数] 一般的存储过程 ... 
- NYOJ题目113字符串替换
			aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAr4AAAHvCAIAAAA930vtAAAgAElEQVR4nO3dPVLjysIG4G8T5CyE2A ... 
- 2014年十个优秀的免费CDN加速服务-国内和国外免费CDN
			这是一篇总结近几年来网络上出现了各类免费CDN服务的文章,文章本来应该早就发出来的,但是因为近期的各种原因一直拖到现在.之前部落已经总结了近几年来的优秀免费空间,新手朋友不必在茫茫“网”海中寻找免费空 ... 
- Android高性能ORM数据库DBFlow入门
			DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ... 
- hdu 5018 Revenge of Fibonacci
			大水题 #include<time.h> #include <cstdio> #include <iostream> #include<algorithm&g ... 
- Deci and Centi Seconds parsing in java
			http://stackoverflow.com/questions/14558663/deci-and-centi-seconds-parsing-in-java 
- C#值类型与引用类型
			值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据.其在MSDN的定义为值类型直接包含它们的数据,值类型的 ... 
- jQuery Mobile学习之grid、等待显示的ajax效果、页面跳转、页面跳转传递参数等(二)
			Index.cshtml <!-- Start of second page --> <section data-role="page" id="bar ... 
- 【php全局变量和静态变量、静态方法的使用方法】
			php全局变量使用关键字global声明,静态变量使用static声明,静态变量的使用可以使用 类名::变量名 示例代码: <?php //全局变量global 的用法和静态变量的使用 glob ... 
- NuGet安装和使用
			1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update l ... 
 
			
		