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> ...
随机推荐
- mongodb3.x用户角色
用户和角色是多对多的关系,一个用户可以对应多个角色,一个角色可以拥有多个用户.用户角色的不同对应的权限也是不一样的.下面是一些分配给用户的常见的角色. read ...
- 直接放个DB2 SQL STATEMENT大全好了!
SQL statements This topic contains tables that list the SQL statements classified by type. SQL sch ...
- DB2 create partitioned table
在Z上和开放平台上的创建方法还不太一样,两套人马开发出来的就是牛! 蛋疼…… 贴不同类型的几个例子感受一下,Z上的ASC,DESC不见了: CREATE TABLE foo(a INT) PARTIT ...
- C#的正则表达式
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
- APP消息推送:通知和透传
目前市场上的消息推送方式有两种:通知和透传.什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理.透传消息, ...
- MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet(转载)
转载地址:http://blog.csdn.net/21aspnet/article/details/21867241 1.安装准备 1).下载安装MyEclipse2014,这已经是最新版本. 2) ...
- web magic 小结
缘起 写了多年的程序,鲜有产出物,于是最近打算做个不可说的东西来祭奠逝去的青春.数据,是一个程序的起点,我们没有数以亿计的用户,无法让活跃用户给我们产生数据,那就只能去别人的站点上借点数据了.这个功能 ...
- Oracle性能优化
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照 从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最 ...
- 新浪微博的账号登录及api操作
.sina.php <?php /** * PHP Library for weibo.com * * @author */ class sinaPHP { function __constru ...
- 把浏览器的私有模式添加到VS中
题记:在用VS进行Web开发的时候,常常希望VS的调试不会对浏览器造成固定的影响,那么使用浏览器的私有模式来启动就很有必要. 前几天SCOTT HANSELMAN分享了一个开发Web应用程序的小技巧, ...
