P4390 [BOI2007]Mokia 摩基亚

题目描述

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

在定位系统中,世界被认为是一个\(W\times W\)的正方形区域,由\(1\times1\)的方格组成。每个方格都有一个坐标\((x,y)\),\(1\le x,y\le W\)。坐标的编号从\(1\)开始。对于一个\(4\times4\)的正方形,就有\(1\le x\le 4,1\le y\le 4\)(如图):

请帮助\(Mokia\)公司编写一个程序来计算在某个矩形区域内有多少名用户。

输入输出格式

输入格式:

有三种命令,意义如下:

命令 参数 意义

  • 0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
  • 1 x y A 向方格\((x,y)\)中添加\(A\)个用户。\(A\)是正整数。
  • 2 X1 Y1 X2 Y2 查询\(X_1\le x\le X_2,Y_1\le y\le Y_2\)所规定的矩形中的用户数量
  • 3 无参数 结束程序。本命令仅结束时出现一次。

输出格式:

对所有命令\(2\),输出一个一行整数,即当前询问矩形内的用户数量。

说明

对于所有数据:

\(1\le W\le 2000000\)
\(1\le X_1\le X_2\le W\)
\(1\le Y_1\le Y_2\le W\)
\(1\le x,y\le W\)
\(0<A\le 10000\)
命令\(1\)不超过\(160000\)个。
命令\(2\)不超过\(10000\)个。


之前做了个园丁的题目,是所有询问在修改之后的。

于是直接把四维偏序的一维搞成区间操作\(O(n\log^2n)\)水过去了。

然后这个题就萎掉了,想了一会儿还是三个\(\log\),于是打算拿树套树水过去。

结果套的线段树\(MLE\)了,无语...

然后看了看正解,发现直接对矩形容斥就可以了。

就是把一个矩形\((a,b),(c,d)\)拆成\((1,1),(a-1,b-1)\)、\((1,1),(a-1,d)\)、\((1,1),(c,b-1)\)、\((1,1),(c,d)\)四个做。

然后就又成了三维偏序...


Code:

#include <cstdio>
#include <algorithm>
const int N=2e5+10;
int n,m,k,op,ans[N],s[N<<2],dx[N<<2],cntx,dy[N<<2],cnty;
void add(int x,int d){while(x<=cnty)s[x]+=d,x+=x&-x;}
int ask(int x){int sum=0;while(x)sum+=s[x],x-=x&-x;return sum;}
struct node
{int a,b,c,op;bool friend operator <(node n1,node n2){return n1.a==n2.a?n1.op<n2.op:n1.a<n2.a;}
}q[N],qs[N];
void CDQ(int l,int r)
{if(l==r) return;int mid=l+r>>1;CDQ(l,mid),CDQ(mid+1,r);int lp=l,rp=mid+1,loc=l-1;while(lp<=mid&&rp<=r){if(q[lp]<q[rp]){if(!q[lp].op) add(q[lp].b,q[lp].c);qs[++loc]=q[lp++];}else{if(q[rp].op) ans[q[rp].op]+=q[rp].c*ask(q[rp].b);qs[++loc]=q[rp++];}}while(rp<=r){if(q[rp].op) ans[q[rp].op]+=q[rp].c*ask(q[rp].b);qs[++loc]=q[rp++];}for(int i=l;i<lp;i++) if(!q[i].op) add(q[i].b,-q[i].c);while(lp<=mid) qs[++loc]=q[lp++];for(int i=l;i<=r;i++) q[i]=qs[i];
}
int main()
{scanf("%d%d",&n,&n);scanf("%d",&op);int a,b,c,d;while(op!=3){if(op==1){++m;scanf("%d%d%d",&q[m].a,&q[m].b,&q[m].c);dx[++cntx]=q[m].a,dy[++cnty]=q[m].b;}else{scanf("%d%d%d%d",&a,&b,&c,&d);dx[++cntx]=a-1,dy[++cnty]=b-1,dx[++cntx]=c,dy[++cnty]=d;++k;q[++m]={a-1,b-1,1,k};q[++m]={a-1,d,-1,k};q[++m]={c,b-1,-1,k};q[++m]={c,d,1,k};}scanf("%d",&op);}std::sort(dx+1,dx+1+cntx);std::sort(dy+1,dy+1+cnty);cntx=std::unique(dx+1,dx+1+cntx)-dx-1;cnty=std::unique(dy+1,dy+1+cnty)-dy-1;for(int i=1;i<=m;i++){q[i].a=std::lower_bound(dx+1,dx+1+cntx,q[i].a)-dx;q[i].b=std::lower_bound(dy+1,dy+1+cnty,q[i].b)-dy;}CDQ(1,m);for(int i=1;i<=k;i++) printf("%d\n",ans[i]);return 0;
}

2018.11.27

转载于:https://www.cnblogs.com/butterflydew/p/10028401.html

洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告相关推荐

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

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

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

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

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

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

  4. luogu P4390 [BOI2007]Mokia 摩基亚

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

  5. BOI2007 Mokia 摩基亚

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

  6. 【BOI2007】Mokia 摩基亚

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

  7. 洛谷 P2893 [USACO08FEB]修路Making the Grade 解题报告

    P2893 [USACO08FEB]修路Making the Grade 题目描述 A straight dirt road connects two fields on FJ's farm, but ...

  8. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  9. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

最新文章

  1. mac14.5 mojave安装错误
  2. 《Java基础入门》课后习题答案 资源分享
  3. jquery gridly (拖拽插件)
  4. 中国牙科用人工骨替代材料市场供需态势与未来投资方向分析报告2022年
  5. python删除数据库的数据完整代码_利用python操作小程序云数据库实现简单的增删改查...
  6. Callbacks, Promises and Async/Await
  7. 鸿蒙系统全是外国技术,华为正式发布鸿蒙操作系统!四大技术特性亮眼
  8. java web核心编程_JavaWeb核心编程之(三)Servlet配置
  9. 部分国家人均GDP和生活满意度可视化
  10. java文件一行一行读取_java一行一行写入或读取文件
  11. 微信小程序的购物车功能
  12. ARM Uboot经历——Uboot初始化代码解析
  13. Java并发编程学习-日记1、常见的IO模型、NIO、OIO
  14. 微信小程序实现首页图片多种排版布局!
  15. import和export
  16. 记一次组装电脑的经历
  17. 决策树(Decision Tree)算法原理总结(一)
  18. NOJ1055叙拉古猜想——水题
  19. 视频号直播刚改版后怎么开通企业微信
  20. java 面试上机题_java上机笔试试卷

热门文章

  1. SCOM 常识概念—与其他SC产品集成
  2. 电脑linux下载官网下载,Bluestar Linux
  3. mysql 数据库军规_用尽洪荒之力整理的Mysql数据库32条军规(转)
  4. 云计算成了“晕技术”就对了
  5. 六、传递、返回复杂类型的对象
  6. pscad 如何产生一个阶跃信号_宇宙中第一个量子场是如何产生的?
  7. [短评]企业裁员行为对整个社会的正面意义
  8. Go 1.9中值得关注的几个变化
  9. DragonBones快速入门指南
  10. 游戏服务器的架构设计(一点参考,实际价值似乎不大……)