分治(CDQ):[BOI2007]摩基亚Mokia
【题目描述】
摩尔瓦多的移动电话公司摩基亚(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个。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=;
const int maxs=;
struct Node{
int id,x,y,d,ans;
Node(int id_=,int x_=,int y_=,int d_=,int ans_=){
id=id_;x=x_;y=y_;d=d_;ans=ans_;
}
}p[maxn],t[maxn];
int bit[maxs],s,op,cnt;
int vis[maxs],dep;
void add(int x,int d){
while(x<=s){
if(vis[x]!=dep)
bit[x]=;
bit[x]+=d;
vis[x]=dep;
x+=x&(-x);
}
}
int Query(int x){
int ret=;
while(x){
if(vis[x]==dep)
ret+=bit[x];
x-=x&(-x);
}
return ret;
} bool cmp1(Node a,Node b){
return a.x<b.x;
} bool cmp2(Node a,Node b){
return a.id<b.id;
}
void Solve(int l,int r){
if(l==r)return;
int mid=(l+r)>>,t1=l,t2=mid+;
for(int i=l;i<=r;i++){
if(p[i].id<=mid)t[t1++]=p[i];
else t[t2++]=p[i];
}
for(int i=l;i<=r;i++)p[i]=t[i];
Solve(l,mid);++dep;
for(int i=mid+,j=l;i<=r;i++){
for(;p[i].x>=p[j].x&&j<=mid;j++)
if(p[j].d!=-)
add(p[j].y,p[j].d);
if(p[i].d==-)
p[i].ans+=Query(p[i].y);
}
Solve(mid+,r);
t1=l;t2=mid+;
for(int i=l;i<=r;i++)
if(t2==r+||p[t1].x<p[t2].x&&t1<=mid)t[i]=p[t1++];
else t[i]=p[t2++];
for(int i=l;i<=r;i++)p[i]=t[i];
} int main(){
freopen("mokia.in","r",stdin);
freopen("mokia.out","w",stdout);
int a,b,x,y;
scanf("%d%d",&a,&s);
while(~scanf("%d",&op)&&op!=){
if(op==){
scanf("%d%d%d",&x,&y,&a);
p[++cnt]=Node(cnt,x,y,a);
}
else{
scanf("%d%d%d%d",&x,&y,&a,&b);
p[++cnt]=Node(cnt,a,b,-);
p[++cnt]=Node(cnt,a,y-,-);
p[++cnt]=Node(cnt,x-,b,-);
p[++cnt]=Node(cnt,x-,y-,-);
}
}
sort(p+,p+cnt+,cmp1);
Solve(,cnt);
sort(p+,p+cnt+,cmp2);
for(int i=,ret;i<=cnt;i++)
if(p[i].d==-){
ret=;
ret+=p[i].ans;
ret-=p[++i].ans;
ret-=p[++i].ans;
ret+=p[++i].ans;
printf("%d\n",ret);
}
return ;
}
分治(CDQ):[BOI2007]摩基亚Mokia的更多相关文章
- COGS1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★☆ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- COJS 1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★★ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...
- COGS1752. [BOI2007]摩基亚Mokia CDQ
CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...
- 【COGS1752】 BOI2007—摩基亚Mokia
http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...
- [COGS 1752] 摩基亚Mokia
照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in 输出文件:mokia.out 时间限制:1.5 s 内存限制:128 MB [题目描述] 摩尔瓦多的移 ...
- [BOI2007]摩基亚
题目:洛谷P4390.BZOJ1176. 题目大意: 给你一个\(W\times W\)的矩阵,初始每个数都为\(S\).现在有若干操作: 1. 给某个格子加上一个值:2. 询问某个子矩阵的值的和:3 ...
随机推荐
- RHEL7重置root密码
一.rd.break方法 在linux16那一段的最后,空一格输入rd.break 按Ctrl+启动到单用户模式,如下: 进去后输入命令mount,发现根为/sysroot/,并且不能写,只有ro=r ...
- poj 3463 Sightseeing(次短路+条数统计)
/* 对dij的再一次理解 每个点依旧永久标记 只不过这里多搞一维 0 1 表示最短路还是次短路 然后更新次数相当于原来的两倍 更新的时候搞一下就好了 */ #include<iostream& ...
- [Redis] C#中使用redis
C#中使用redis 首先打开Visual Studio建立一个简单的控制台应用程序,我这里暂时使用的VS2013的版本. 然后通过Nuget进行安装Redis常用组件ServiceStack.Red ...
- LINQ高级编程 笔记
相关资料:http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 1.什么是LINQ 语言集成查询是一系列标准查询操作符的集合, ...
- CentOS 5.4下的Memcache安装步骤(Linux+Nginx+PHP+Memcached)
原文链接:http://www.jb51.net/article/29668.htm
- VS2015 Cordova Ionic移动开发(五)
一.创建侧边菜单和导航项目 1.使用VS创建一个Ionic空项目,同时创建一个Ionic SideMenu和Ionic Tabs项目.将SideMenu和Tabs项目里的templates和js文件合 ...
- OUTPUT、Merge语句的使用
新版本的数据库中增加了OUTPUT子句,这个很好用,详细的使用方式大家可以参考SQL的联机帮助文档.这里仅记录下常用的场景:在对数据库进行增删改的时候我们有时候需要记录日志(这里指将日志记录在DB中而 ...
- 如何在xcode下面同时安装cocos2d-iphone 和 cocos2d-x模板,其实是因为很喜欢C++的缘故,当时学习的是前者,现在自己摸着石头过河了就(cocos2d-x安装失败 出错)
首先在Xcode下面配置两个模板的开发环境,其实一个开源库,一个C++移植,学习需要也是,我的mac上一直用的是cocos2d-iphone, 今天想试下cocos2d-x,安装的时间发现安装成功(我 ...
- 关于c:\fakepath\的解决办法
(2014.11.25 最后更新) 一.碎碎念:关于访问本地图片的路径的问题,比较典型的例子就是上传头像.在以往的解决办法中,我们大多是先将图片上传到服务器然后从服务器返回图片,显示在页面上以达到预览 ...
- Long型整数,缄默溢出
/** 长整数问题 @author husky */ public class LongDemo { public static void main(String[] args) { /** * 问题 ...