[COGS 1752] 摩基亚Mokia
2017-07-20 19:19
225 查看
照例先上题面
[b]1752. [BOI2007]摩基亚Mokia[/b]
输入文件:mokia.in 输出文件:mokia.out
时间限制:1.5 s 内存限制:128 MB
【题目描述】
摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。
在定位系统中,世界被认为是一个W×W的正方形区域,由1×1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4×4的正方形,就有1<=x<=4,1<=y<=4(如图):
请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用
【输入格式】
有三种命令,意义如下:
【输出格式】
对所有命令2,输出一个一行整数,即当前询问矩形内的用户数量。
【输入样例】
0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
【输出样例】
3
5
【提示】
【数据规模】
1<=W<=2000000
1<=X1<=X2<=W
1<=Y1<=Y2<=W
1<=x,y<=W
0<A<=10000
命令1不超过160000个。
命令2不超过10000个。
【来源】
Balkan Olypiad in Informatics 2007,Mokia
一句话题意:维护一个W*W的矩阵,初始值均为0.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.
看到题之后第一眼我们或许会考虑二维树状数组,但是后来我们发现这个蜜汁数据范围刚好卡掉了$O((M+Q)*log^2W)$的二维树状数组...
然后我们注意到题目没有要求强制在线,所以我们可以考虑CDQ分治来解决这个问题.
CDQ分治的详解我打算放在下一篇博文w所以在这里先不详细解释了QwQ
作为CDQ分治的裸题我就直接贴袋马了憋打我(逃
GitHub
Backup
扔个图就跑
[b]1752. [BOI2007]摩基亚Mokia[/b]
输入文件:mokia.in 输出文件:mokia.out
时间限制:1.5 s 内存限制:128 MB
【题目描述】
摩尔瓦多的移动电话公司摩基亚(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 | 无参数 | 结束程序。本命令仅结束时出现一次。 |
对所有命令2,输出一个一行整数,即当前询问矩形内的用户数量。
【输入样例】
0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
【输出样例】
3
5
【提示】
输入 | 输出 | 意义 |
0 4 | 大小为4×4的全零正方形 | |
1 2 3 3 | 向(2,3)方格加入3名用户 | |
2 1 1 3 3 | 查询矩形1<=x<=3,1<=y<=3内的用户数量 | |
3 | 查询结果 | |
1 2 2 2 | 向(2,2)方格加入2名用户 | |
2 2 2 3 4 | 查询矩形2<=x<=3,2<=y<=4内的用户数量 | |
5 | 查询结果 | |
3 | 终止程序 |
1<=W<=2000000
1<=X1<=X2<=W
1<=Y1<=Y2<=W
1<=x,y<=W
0<A<=10000
命令1不超过160000个。
命令2不超过10000个。
【来源】
Balkan Olypiad in Informatics 2007,Mokia
一句话题意:维护一个W*W的矩阵,初始值均为0.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.
看到题之后第一眼我们或许会考虑二维树状数组,但是后来我们发现这个蜜汁数据范围刚好卡掉了$O((M+Q)*log^2W)$的二维树状数组...
然后我们注意到题目没有要求强制在线,所以我们可以考虑CDQ分治来解决这个问题.
CDQ分治的详解我打算放在下一篇博文w所以在这里先不详细解释了QwQ
作为CDQ分治的裸题我就直接贴袋马了憋打我(逃
GitHub
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> const int MAXW=2000010; const int MAXA=800010; struct Node{ int x; int y; int ID; int value; int position; int operation; bool operator<(const Node& x)const{ if(this->x==x.x&&this->y==x.y) return this->operation<x.operation; else return this->x==x.x?this->y<x.y:this->x<x.x; } }; Node query[MAXA]; Node tmp[MAXA]; int n; int m; int cnt; int c[MAXW]; int ans[MAXA]; int Query(int); int LowBit(int); void Add(int,int); void FastRead(int&); void CDQ(int,int); int main(){ #ifndef ASC_LOCAL freopen("mokia.in","r",stdin); freopen("mokia.out","w",stdout); #endif int operation; FastRead(n); FastRead(n); while(true){ FastRead(operation); if(operation==1){ ++m; FastRead(query[m].x); FastRead(query[m].y); FastRead(query[m].value); query[m].operation=0; } else if(operation==2){ int x1,x2,y1,y2; cnt++; FastRead(x1); FastRead(y1); FastRead(x2); FastRead(y2); query[++m].position=cnt; query[m].x=x1-1; query[m].y=y1-1; query[m].value=1; query[m].operation=1; query[++m].position=cnt; query[m].x=x2; query[m].y=y2; query[m].value=1; query[m].operation=1; query[++m].position=cnt; query[m].x=x1-1; query[m].y=y2; query[m].value=-1; query[m].operation=1; query[++m].position=cnt; query[m].x=x2; query[m].y=y1-1; query[m].value=-1; query[m].operation=1; } else break; } for(int i=1;i<=m;i++) query[i].ID=i; std::sort(query+1,query+m+1); CDQ(1,m); for(int i=1;i<=cnt;i++) printf("%d\n",ans[i]); return 0; } void CDQ(int l,int r){ if(l==r) return; int mid=(l+r)>>1; int ll=l; int lr=mid+1; for(int i=l;i<=r;i++){ if(query[i].ID<=mid&&query[i].operation==0) Add(query[i].y,query[i].value); if(query[i].ID>mid&&query[i].operation==1) ans[query[i].position]+=query[i].value*Query(query[i].y); } for(int i=l;i<=r;i++){ if(query[i].ID<=mid&&query[i].operation==0) Add(query[i].y,-query[i].value); } for(int i=l;i<=r;i++){ if(query[i].ID<=mid) tmp[ll++]=query[i]; else tmp[lr++]=query[i]; } for(int i=l;i<=r;i++) query[i]=tmp[i]; CDQ(l,mid); CDQ(mid+1,r); } inline int Query(int x){ int ans=0; for(;x>0;x-=LowBit(x)){ ans+=c[x]; } return ans; } inline void Add(int x,int d){ for(;x<=n;x+=LowBit(x)){ c[x]+=d; } } inline int LowBit(int x){ return x&-x; } void FastRead(int& target){ target=0; register char ch=getchar(); while(!isdigit(ch)&&ch!=EOF) ch=getchar(); while(isdigit(ch)){ target=target*10+ch-'0'; ch=getchar(); } }
Backup
扔个图就跑
相关文章推荐
- cogs1752[boi2007]mokia 摩基亚 (cdq分治)
- Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
- Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
- COGS1752. [BOI2007]摩基亚Mokia
- COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)
- cogs 1752 [BOI2007]摩基亚Mokia(cdq分治+树状数组)
- cogs 1752. [BOI2007]摩基亚Mokia
- cdq分治入门学习 cogs 1752 Mokia nwerc 2015-2016 G 二维偏序
- [Luogu4390][BOI2007]Mokia 摩基亚
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
- 【COGS】1752. [BOI2007]摩基亚Mokia cdq分治模板题
- 【COGS1752】 BOI2007—摩基亚Mokia
- COGS1752. [BOI2007]摩基亚Mokia CDQ
- sicily 1752 选择
- COGS 614 游历校园
- cogs 数列
- 【COGS】714. USACO 1.3.2混合牛奶(贪心+水题)
- 【COGS】1595 [USACO FEB05]神秘的挤奶机 二分最大流
- [COGS1133]黑白棋游戏 解题报告
- cogs1355. 读书题解