COJS 1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia
★★★ 输入文件:mokia.in 输出文件:mokia.out 简单对比
时间限制: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
【数据规模】
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
解题:CDQ分治
#include <bits/stdc++.h>
using namespace std;
const int maxn = ;
struct QU {
int x1,x2,y,f,id;
bool operator<(const QU &t) const {
return y == t.y?id < t.id:y < t.y;
}
} A[maxn<<],B[maxn<<],Q[maxn<<];
int C[maxn<<],Li[maxn<<],ans[maxn<<],tot,cnt,ask;
void add(int i,int val) {
for(; i < maxn; i += i&(-i)) C[i] += val;
}
int sum(int i) {
int ret = ;
for(; i > ; i -= i&(-i)) ret += C[i];
return ret;
}
void cdq(int L,int R) {
if(R <= L) return;
int mid = (L + R)>>;
cdq(L,mid);
cdq(mid + ,R);
int a = ,b = ,j = ;
for(int i = L; i <= mid; ++i)
if(Q[i].id == -) A[a++] = Q[i];
for(int i = mid+; i <= R; ++i)
if(Q[i].id != -) B[b++] = Q[i];
sort(A,A + a);
sort(B,B + b);
for(int i = ; i < b; ++i) {
for(; j < a && A[j].y <= B[i].y; ++j) add(A[j].x1,A[j].f);
ans[B[i].id] += B[i].f*sum(B[i].x2);
ans[B[i].id] -= B[i].f*sum(B[i].x1);
}
for(int i = ; i < j; ++i)
add(A[i].x1,-A[i].f);
}
int main() {
int n,op;
freopen ( "mokia.in", "r", stdin ) ;
freopen ( "mokia.out", "w", stdout ) ;
while(~scanf("%*d%d",&n)) {
memset(C,,sizeof C);
memset(ans,,sizeof ans);
tot = cnt = ask = ;
while(scanf("%d",&op),op < ) {
if(op == ) {
scanf("%d%d%d",&Q[cnt].x1,&Q[cnt].y,&Q[cnt].f);
Li[tot++] = Q[cnt].x1;
Q[cnt++].id = -;
} else if(op == ) {
scanf("%d%d%d%d",&Q[cnt].x1,&Q[cnt+].y,&Q[cnt+].x2,&Q[cnt].y);
Li[tot++] = Q[cnt].x1-;
Li[tot++] = Q[cnt+].x2;
--Q[cnt+].y;
Q[cnt].x2 = Q[cnt+].x2;
Q[cnt+].x1 = Q[cnt].x1;
Q[cnt].id = Q[cnt+].id = ask++;
Q[cnt++].f = ;
Q[cnt++].f = -;
}
}
sort(Li,Li + tot);
tot = unique(Li,Li + tot) - Li;
for(int i = ; i < cnt; ++i) {
if(Q[i].id == -) Q[i].x1 = lower_bound(Li,Li + tot,Q[i].x1) - Li + ;
else {
Q[i].x1 = lower_bound(Li,Li + tot,Q[i].x1 - ) - Li + ;
Q[i].x2 = lower_bound(Li,Li + tot,Q[i].x2) - Li + ;
}
}
cdq(,cnt-);
for(int i = ; i < ask; ++i)
printf("%d\n",ans[i]);
}
return ;
}
COJS 1752. [BOI2007]摩基亚Mokia的更多相关文章
- COGS1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★☆ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- 分治(CDQ):[BOI2007]摩基亚Mokia
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...
- COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...
- 【COGS1752】 BOI2007—摩基亚Mokia
http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...
- Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...
- COGS1752. [BOI2007]摩基亚Mokia CDQ
CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- [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 ...
随机推荐
- SSH整合总结(OA项目)
代码规范 环境搭建 Struts2 jar包 struts.xml, web.xml Hibernatejar包:核心包, 必须包, jpa, c3p0, jdbchibernate.cfg.xml, ...
- MSMQ如何设置事务特性
- BA-防冻开关的安装
防冻开关学名:防冻恒温保护器,在通风空调系统中监测加热盘管空气侧温度来防止盘管冻坏.具有较小的转换差和良好的重复性.可自动复位.当在30cm长的毛细管上温度低于选择的设定值时会产生一个闭合信号给DDC ...
- 洛谷 U6850 手机密码
U6850 手机密码 题目背景 小明的手机上设了一个由四个数字组成的密码,但是小明自己的记性不好,但又不想把密码直接记在纸上,于是便想了一个方法. 题目描述 小明有四行数字,每行数字都有n[i](&l ...
- Android开发之配置adb工具的环境变量
在Android开发中,adb是一个非常好用也非常使用的工具,可是使用的时候假设没有改动环境变量,每一次都须要输入全然路径非常麻烦.解决的方法是在环境变量中加入adb工具的路径. Windows平台 ...
- 利用POI操作不同版本号word文档中的图片以及创建word文档
我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写 ...
- 基于nginx的TCP Proxy实现数据库读写分离
nginx非常早就支持tcp proxy.可是一直不知道其使用,近期在nginx blog上看见了.一些实践者将其运用到数据库訪问的负载均衡以及实现读写分离,来提高数据库的吞吐量,这里我不会讲详细的搭 ...
- java痛苦学习之路[四]---关于struts2-convention-plugin使用
一.struts2-convention-plugin配置文件具体解释 <constant name="struts.convention.actionConfigBuilder&qu ...
- 【POJ 3904】 Sky Code
[题目链接] http://poj.org/problem?id=3904 [算法] 问题可以转化为求总的四元组个数 - 公约数不为1的四元组个数 总的四元组个数为C(n,4),公约数不为1的四元组个 ...
- 移动端H5页面编辑器开发实战--经验技巧篇
很久前的写的文章了,转载下发到这里 原本地址: https://blog.csdn.net/tech_meizu/article/details/52484775