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分治

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 300010;
 4 struct QU {
 5     int x1,x2,y,f,id;
 6     bool operator<(const QU &t) const {
 7         return y == t.y?id < t.id:y < t.y;
 8     }
 9 } A[maxn<<1],B[maxn<<1],Q[maxn<<1];
10 int C[maxn<<1],Li[maxn<<1],ans[maxn<<1],tot,cnt,ask;
11 void add(int i,int val) {
12     for(; i < maxn; i += i&(-i)) C[i] += val;
13 }
14 int sum(int i) {
15     int ret = 0;
16     for(; i > 0; i -= i&(-i)) ret += C[i];
17     return ret;
18 }
19 void cdq(int L,int R) {
20     if(R <= L) return;
21     int mid = (L + R)>>1;
22     cdq(L,mid);
23     cdq(mid + 1,R);
24     int a = 0,b = 0,j = 0;
25     for(int i = L; i <= mid; ++i)
26         if(Q[i].id == -1) A[a++] = Q[i];
27     for(int i = mid+1; i <= R; ++i)
28         if(Q[i].id != -1) B[b++] = Q[i];
29     sort(A,A + a);
30     sort(B,B + b);
31     for(int i = 0; i < b; ++i) {
32         for(; j < a && A[j].y <= B[i].y; ++j) add(A[j].x1,A[j].f);
33         ans[B[i].id] += B[i].f*sum(B[i].x2);
34         ans[B[i].id] -= B[i].f*sum(B[i].x1);
35     }
36     for(int i = 0; i < j; ++i)
37         add(A[i].x1,-A[i].f);
38 }
39 int main() {
40     int n,op;
41     freopen ( "mokia.in", "r", stdin ) ;
42     freopen ( "mokia.out", "w", stdout ) ;
43     while(~scanf("%*d%d",&n)) {
44         memset(C,0,sizeof C);
45         memset(ans,0,sizeof ans);
46         tot = cnt = ask = 0;
47         while(scanf("%d",&op),op < 3) {
48             if(op == 1) {
49                 scanf("%d%d%d",&Q[cnt].x1,&Q[cnt].y,&Q[cnt].f);
50                 Li[tot++] = Q[cnt].x1;
51                 Q[cnt++].id = -1;
52             } else if(op == 2) {
53                 scanf("%d%d%d%d",&Q[cnt].x1,&Q[cnt+1].y,&Q[cnt+1].x2,&Q[cnt].y);
54                 Li[tot++] = Q[cnt].x1-1;
55                 Li[tot++] = Q[cnt+1].x2;
56                 --Q[cnt+1].y;
57                 Q[cnt].x2 = Q[cnt+1].x2;
58                 Q[cnt+1].x1 = Q[cnt].x1;
59                 Q[cnt].id = Q[cnt+1].id = ask++;
60                 Q[cnt++].f = 1;
61                 Q[cnt++].f = -1;
62             }
63         }
64         sort(Li,Li + tot);
65         tot = unique(Li,Li + tot) - Li;
66         for(int i = 0; i < cnt; ++i) {
67             if(Q[i].id == -1) Q[i].x1 = lower_bound(Li,Li + tot,Q[i].x1) - Li + 1;
68             else {
69                 Q[i].x1 = lower_bound(Li,Li + tot,Q[i].x1 - 1) - Li + 1;
70                 Q[i].x2 = lower_bound(Li,Li + tot,Q[i].x2) - Li + 1;
71             }
72         }
73         cdq(0,cnt-1);
74         for(int i = 0; i < ask; ++i)
75             printf("%d\n",ans[i]);
76     }
77     return 0;
78 }

View Code

转载于:https://www.cnblogs.com/crackpotisback/p/4725000.html

COJS 1752. [BOI2007]摩基亚Mokia相关推荐

  1. 【COGS1752】 BOI2007—摩基亚Mokia

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

  2. Bzoj1176:MokiaCogs1752:[BOI2007]摩基亚Mokia

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

  3. 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)

    题目链接:点击查看 题目大意:给出一个二维平面坐标系,需要执行数次操作,具体操作分为下列两种: 1 x y a:坐标 (x,y)(x,y)(x,y) 加上 aaa 个点 2 x1 y1 x2 y2:查 ...

  4. 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告

    P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...

  5. 洛谷P4390 [BOI2007]Mokia 摩基亚 题解

    洛谷P4390 [BOI2007]Mokia 摩基亚 题解 题目链接:P4390 [BOI2007]Mokia 摩基亚 题意:摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和 ...

  6. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)

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

  7. luogu P4390 [BOI2007]Mokia 摩基亚

    传送门 昨天做完三维偏序并不能理解CDQ 今天做了这个题才行 (觉得没理解三维偏序是因为二维偏序没按正常方式理解) CDQ分治应用于数据结构 适用于离线的题 原理是后面的询问只能被前面的修改影响 可以 ...

  8. 【BOI2007】Mokia 摩基亚

    传送门 CDQ分治板子题 其实和陌上花开差不多 把时间. l . r l.r l.r看成三个维度 像二维树状数组统计一样,把每一个询问拆成四块前缀和相减 然后统计答案的时候容斥一下 那么现在需要考虑的 ...

  9. BOI2007 Mokia 摩基亚

    题目描述 题解: 容斥,将询问变成4个加权询问. 然后就是cdq了. 代码: #include<cstdio> #include<cstring> #include<al ...

最新文章

  1. SpringCloud中Hystrix容错保护原理及配置,看它就够了!
  2. 北京 10 年,难说再见!
  3. IBM WebSphere MQ 系列(二)安装MQ
  4. opencv入门 - 显示图像学习总结
  5. HNCU 1741: 算法3-2:行编辑程序
  6. 字典与集合_月隐学python第8课
  7. 12015.linux通过代码或命令形式操作内存/dev/mem
  8. FullCalendar应用——整合农历节气和节日
  9. 【渝粤教育】国家开放大学2019年春季 2633轨道交通信号与通信系统 参考试题
  10. GOM引擎 mirserver服务端各文件夹注解
  11. 服务器存储位置,云储存位置及存储服务器
  12. 苹果账号的分类以及注册免费苹果账号
  13. python修改游戏数据_python1.2-----pywin32模块/语音合成,窗口闪烁以及修改游戏数据的技巧...
  14. Vue动态计算百分比配合vux插件
  15. RTX 3080和RTX 2080 Ti哪个好
  16. Macbook 开机黑屏
  17. linux中write的实例,Linux内核 down_write()
  18. 【汇正财经】股票是长期持有好还是短线好?
  19. 【Electron】酷家乐客户端开发实践分享 — 下载管理器
  20. RK3588 Android平台SPI NOR+PCIE SSD实现大容量存储方案

热门文章

  1. mysql 字段操作
  2. C语言 pthread_create
  3. Python Base64
  4. java ajax 联动菜单_java结合jQuery.ajax实现左右菜单联动刷新列表内容
  5. 云服务器 ECS > 块存储 > 块存储介绍 > 块存储概述 请输入关键词
  6. Css学习总结(5)——CSS常见布局方式
  7. Nginx学习总结(8)——Nginx服务器详解
  8. Docker学习总结(24)——在Docker中监视Java应用程序的5种方法
  9. mysql 压缩备份_备份压缩mysql 数据库
  10. iOS上传图片和视频(base64和file)