题目描述

摩尔瓦多的移动电话公司摩基亚(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,输出一个一行整数,即当前询问矩形内的用户数量。

输入输出样例

输入样例#1:

  1. 0 4
  2. 1 2 3 3
  3. 2 1 1 3 3
  4. 1 2 2 2
  5. 2 2 2 3 4
  6. 3
输出样例#1:

  1. 3
  2. 5

说明

1<=W<=2000000

1<=X1<=X2<=W

1<=Y1<=Y2<=W

1<=x,y<=W

0<A<=10000

命令1不超过160000个。

命令2不超过10000个。

CDQ求解三维偏序模板题。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int maxn=200005;
  5. struct node{
  6. int x,y,z,num,FL;
  7. }a[maxn];
  8. int opt,A,B,C,D,cnt=0,W,qnum;
  9. int ans[maxn],f[maxn],T;
  10.  
  11. inline bool cmp3(node x,node y){
  12. return x.z==y.z?x.num<y.num:x.z<y.z;
  13. }
  14.  
  15. inline bool cmp2(node x,node y){
  16. return x.y==y.y?cmp3(x,y):x.y<y.y;
  17. }
  18.  
  19. inline bool cmp1(node x,node y){
  20. return x.x==y.x?cmp2(x,y):x.x<y.x;
  21. }
  22.  
  23. inline void update(int x,int y){
  24. for(;x<=T;x+=x&-x) f[x]+=y;
  25. }
  26.  
  27. inline int query(int x){
  28. int an=0;
  29. for(;x;x-=x&-x) an+=f[x];
  30. return an;
  31. }
  32.  
  33. void cdq(int L,int R){
  34. if(L>=R) return;
  35. int mid=L+R>>1,i,j;
  36. cdq(L,mid),cdq(mid+1,R);
  37. sort(a+L,a+mid+1,cmp2);
  38. sort(a+mid+1,a+R+1,cmp2);
  39.  
  40. for(i=L,j=mid+1;j<=R;j++){
  41. for(;i<=mid&&a[i].y<=a[j].y;i++) if(!a[i].num) update(a[i].z,a[i].FL);
  42. if(a[j].num) ans[a[j].num]+=a[j].FL*query(a[j].z);
  43. }
  44.  
  45. for(i--;i>=L;i--) if(!a[i].num) update(a[i].z,-a[i].FL);
  46. }
  47.  
  48. int main(){
  49. scanf("%d%d",&opt,&W);
  50. while(scanf("%d",&opt)==1&&opt!=3){
  51. T++;
  52. if(opt==1){
  53. scanf("%d%d%d",&A,&B,&C);
  54. a[++cnt]=(node){A,B,T,0,C};
  55. }
  56. else{
  57. qnum++;
  58. scanf("%d%d%d%d",&A,&B,&C,&D);
  59. a[++cnt]=(node){C,D,T,qnum,1};
  60. a[++cnt]=(node){A-1,B-1,T,qnum,1};
  61. a[++cnt]=(node){A-1,D,T,qnum,-1};
  62. a[++cnt]=(node){C,B-1,T,qnum,-1};
  63. }
  64. }
  65.  
  66. sort(a+1,a+cnt+1,cmp1);
  67. cdq(1,cnt);
  68.  
  69. for(int i=1;i<=qnum;i++) printf("%d\n",ans[i]);
  70. return 0;
  71. }

  

[BOI2007] Mokia的更多相关文章

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

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

  2. 【BZOJ1176】[BOI2007]Mokia 摩基亚

    [BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...

  3. [BOI2007]Mokia 摩基亚

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

  4. cogs1752[boi2007]mokia 摩基亚 (cdq分治)

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

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

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

  6. [BOI2007]Mokia 摩基亚(CDQ分治)

    upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ...

  7. P4390 [BOI2007]Mokia 摩基亚(cdq分治)

    一样是cdq的板子 照着园丁的烦恼就好了 代码 #include <cstdio> #include <cstring> #include <algorithm> ...

  8. 【cdq分治】【P4390】[BOI2007]Mokia 摩基亚

    Description 给你一个 \(W~\times~W\) 的矩阵,每个点有权值,每次进行单点修改或者求某子矩阵内权值和,允许离线 Input 第一行是两个数字 \(0\) 和矩阵大小 \(W\) ...

  9. BOI2007 Mokia | cdq分治求二维点数模板

    题目链接:戳我 也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板.为了之后咕咕咕地复习使用 不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的...qwqw ...

随机推荐

  1. PAT (Advanced Level) Practise - 1096. Consecutive Factors (20)

    http://www.patest.cn/contests/pat-a-practise/1096 Among all the factors of a positive integer N, the ...

  2. hibernate4整合spring3.1的过程中的异常问题

    (1)hibernate4整合spring3.1的过程中,发现了java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider异常 ...

  3. h5快速制作工具-企业级. 非个人无水印

    Epub360 Epub是团队引入的专业级H5应用开发工具,能够快速制作出高质量的H5运营交互页面,具有动画控制.交互设定.社交应用和数据应用的特点,其制作过程就类似于制作一个PPT,比较容易上手. ...

  4. Ukulele 那些花儿

  5. (30)zabbix Trapper 监控项配置

    概述 zabbix获取数据有超时时间,如果一些数据需要执行比较长的时间才能获取的话,那么zabbix会出现异常,考虑到这种情况,zabbix增加了Trapper功能,客户端自己提交数据给zabbix, ...

  6. linux内核数据结构

    https://blog.csdn.net/zhangskd/article/details/11225301 在看ip_acct.c相关代码时看到大量使用了 hlist_nulls_for_each ...

  7. Linux基础学习-使用iSCSI服务部署网络存储

    使用iSCSI服务部署网络存储 iSCSI技术实现了物理硬盘设备与TCP/IP网络协议的相互结合,使得用户可以通过互联网方便地访问远程机房提供的共享存储资源.下面介绍如何在Linux上部署iSCSI服 ...

  8. GIMP模板选区操作

    选择方法有很多种,这里我就新学的方法记录一下,主要是通过小剪刀和Toggle Quick Mask 相结合的运用. 选择Scissors Select Tool工具 设置基本的属性:Antialisa ...

  9. python爬虫(爬取图片)

    python爬虫爬图片 爬虫爬校花网校花的图片 第一步 载入爬虫模块 #载入爬虫模块 import re #载入爬虫模块 import requests #载入爬虫模块 第二步 获得校花网的地址,获得 ...

  10. DELL R730 服务器拷贝大文件

    从服务器上拷贝大文件,通过USB拷贝,写入速度很慢,而且拷贝到100多G的时候直接卡死. 原因:服务器的USB是2.0,传输速率很慢. 解决方法: 找一台笔记本,USB 接口是3.0的,通过网络共享传 ...