【题目描述】

摩尔瓦多的移动电话公司摩基亚(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的更多相关文章

  1. COGS1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★☆   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  2. COJS 1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★★   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  3. COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)

    题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...

  4. COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...

  5. COGS1752. [BOI2007]摩基亚Mokia CDQ

    CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  6. Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia

    题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...

  7. 【COGS1752】 BOI2007—摩基亚Mokia

    http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...

  8. [COGS 1752] 摩基亚Mokia

    照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in   输出文件:mokia.out 时间限制:1.5 s   内存限制:128 MB [题目描述] 摩尔瓦多的移 ...

  9. [BOI2007]摩基亚

    题目:洛谷P4390.BZOJ1176. 题目大意: 给你一个\(W\times W\)的矩阵,初始每个数都为\(S\).现在有若干操作: 1. 给某个格子加上一个值:2. 询问某个子矩阵的值的和:3 ...

随机推荐

  1. Oracle中wm_concat()的使用方法

    以下两种方式使用wm_concat()的使用方法是等效的. 方法一:使用窗口函数,wm_concat支持窗口函数 select distinct classKey,className, classOr ...

  2. div宽度设置无效问题解决

    问题描述: 要设置两个div在同一行显示,都加入了display:inline样式,但是其中一个div的宽度设置无效,在浏览器显示它的宽度始终是1003px. 解决办法: 方法1/给div加入样式:f ...

  3. hive hbase pig 区别

    参考文档http://www.linuxidc.com/Linux/2014-03/98978.htm

  4. WisDom.Net 框架设计(二) 服务总线

    WisDom.Net 框架设计--服务总线 1.Soa 简介     soa 就是面向服务的体系结构 是一个组件模型,不同的组件之间通过定义良好的接口联系起来.就像盖房子一块砖头一块砖头的砌墙,一片一 ...

  5. ToString格式.

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...

  6. Kettle 实现mysql数据库不同表之间数据同步——实验过程

    下面是试验的主要步骤: 在上一篇文章中LZ已经介绍了,实验的环境和实验目的. 在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法, 在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等 ...

  7. 在往oracle中插数据时,如何处理excel读取的时间空值

    //若从excel中读取的时间值为空值时,做如下转换 string YDKGSJ = string.Empty; if (dbdata.Rows[i]["约定开工时间"].ToSt ...

  8. OC - 25.CAKeyframeAnimation

    概述 简介 CAKeyframeAnimation又称关键帧动画 CAKeyframeAnimation是抽象类CAPropertyAnimation的子类,可以直接使用 通过values与path两 ...

  9. OPENGL 地形

    用OPNEGL弄了好久,终于有个地形的样子了! 看起来还是很糟糕....

  10. 『重构--改善既有代码的设计』读书笔记----Replace Data Value with Object

    当你在一个类中使用字段的时候,发现这个字段必须要和其他数据或者行为一起使用才有意义.你就应该考虑把这个数据项改成对象.在开发初期,我们对于新类中的字段往往会采取简单的基本类型形式来保存,但随着我们开发 ...