题面

终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物——小蓝的好友。
在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得的暑假。与小蓝不同,小蓝的好友并不想将时间花在旅游上,而是盯上了最近发行的即时战略游戏——SangoCraft。但在前往通关之路的道路上,一个小游戏挡住了小蓝的好友的步伐。
“国家的战争其本质是抢夺资源的战争”是整款游戏的核心理念,这个小游戏也不例外。简单来说,用户需要在给定的长方形土地上选出一块子矩形,而系统随机生成了N个资源点,位于用户所选的长方形土地上的资源点越多,给予用户的奖励也越多。悲剧的是,小蓝的好友虽然拥有着极其优秀的能力,但同时也有着极差的RP,小蓝的好友所选的区域总是没有一个资源点。
终于有一天,小蓝的好友决定投诉这款游戏的制造厂商,为了搜集证据,小蓝的好友想算出至少包含一个资源点的区域的数量。作为小蓝的好友,这自然是你分内之事。

Input

每个输入文件中仅包含一个测试数据。
第一行包含两个由空格隔开的正整数R,C,N,表示游戏在一块[1,R]X[1,C]的地图上生成了N个资源点。
接下来有N行,每行包含两个整数 x,y,表示这个资源点的坐标
(1<=x<=R,1<=Y<=c)。

Output

输出文件应仅包含一个整数,表示至少包含一个资源点的区域的数量。具体的说,设N个资源点的坐标为(i=1…n),你需要计算有多少个四元组(LB,DB,RB,UB)满足1<=LB<=RB<=R,1<=DB<=UB<=C,且存在一个i使得LB<=Xi<=RB,DB<=Yi<=UB均成立

HINT:资源的位置随机生成

题解

把题目要求转化为总矩形数 - 不包含资源的矩形数。

整个图刷白,把存在z资源的格子染黑(这里把坐标系当成表格,因为题目中其实是允许点和线作为矩形存在的),那么就是求全白子矩形数量。

这是个笛卡尔树或单调栈的经典问题,一般是每行都扫一遍,考虑到这题的数据范围,我们采用扫描线+动态维护

我们从上往下扫,维护向上的矩形,那么动态维护就只需要支持两种操作:整体向上抬升、单点清零。如果基于笛卡尔树的话,就很方便计算贡献了。于是,我们用 fhq Treap 维护笛卡尔树,整体抬升加个标记就是了,单点清零就把整棵树裂成两半,然后直接加在新点的左右儿子处。由于是随机分布,所以不需要用 heap ,本身笛卡尔树就是平衡的了。

于是这题

O

(

n

log

n

)

O(n\log n)

O(nlogn) 无旋 Treap 解决,常数较大,上百毫秒。

但是考虑到我们最后解出问题的核心,其实利用了随机分布

如果你在刚想到单调栈后就留意到随机分布会怎样呢?你会想:一个位置往一个方向跳,每次跳到第一个小于等于先前位置的地方,最多会跳 log 次

于是,除了用 Treap 以外,我们可以直接模拟,维护每个位置往左第一个小于等于他的位置

l

d

ld

ld,以及往右第一个小于等于他的位置

r

d

rd

rd。整体抬升,我们就记录一下当前与底部接壤的矩形个数

x

x

x,抬升时将

x

x

x 加上

(

R

+

1

)

R

/

2

(R+1)\cdot R/2

(R+1)⋅R/2,并将最终答案加上

x

x

x 。单点清零的时候,我们可以直接跳

l

d

ld

ld 和

r

d

rd

rd 往下,计算清零对

x

x

x 以及最终答案的减少量(由于抬升后假设的是该位置无资源,加点后这个地方是有资源的,因此最终答案也有影响),最重要的是,再顺便把沿途的

l

d

ld

ld、

r

d

rd

rd 更新。你会发现,假使一开始定义的是小于而不是小于等于,那么这步没法做。

于是这题模拟

O

(

n

log

n

)

O(n\log n)

O(nlogn) 做,快如指针,常数极小,几十毫秒。

CODE

几十毫秒的代码

  1. #include<set>
  2. #include<map>
  3. #include<stack>
  4. #include<cmath>
  5. #include<ctime>
  6. #include<queue>
  7. #include<bitset>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. #define MAXN 100005
  14. #define LL long long
  15. #define DB double
  16. #define ENDL putchar('\n')
  17. #define lowbit(x) (-(x) & (x))
  18. #define FI first
  19. #define SE second
  20. #define SI(x) multiset<x>::iterator
  21. #define MI map<int,int>::iterator
  22. #define PR pair<int,int>
  23. #define BI(x) bitset<x>
  24. LL read() {
  25. LL f=1,x=0;char s = getchar();
  26. while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
  27. while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
  28. return f*x;
  29. }
  30. void putpos(LL x) {
  31. if(!x) return ;
  32. putpos(x/10); putchar('0'+(x%10));
  33. }
  34. void putnum(LL x) {
  35. if(!x) putchar('0');
  36. else if(x < 0) putchar('-'),putpos(-x);
  37. else putpos(x);
  38. }
  39. void AIput(LL x,char c) {putnum(x);putchar(c);}
  40. int n,m,s,o,k;
  41. int R,C;
  42. vector<int> bu[MAXN];
  43. int a[MAXN],ld[MAXN],rd[MAXN],bt;
  44. LL as1,ans;
  45. LL d1(int l,int r,int m,int h) {return (m-l+1) *1ll* (r-m+1) * h;}
  46. void add(int x,int y) {
  47. int yy = a[x];
  48. int ll = x,rr = x,A = ld[x],B = rd[x];
  49. while(yy > y) {
  50. int ny;
  51. if(a[A] >= y) rd[A] = min(rd[A],x);
  52. if(a[B] >= y) ld[B] = max(ld[B],x);
  53. if(a[A] > a[B]) ny = a[A],A = ld[A];
  54. else ny = a[B],B = rd[B];
  55. while(a[ll] > max(y,ny)) ll = ld[ll];
  56. while(a[rr] > max(y,ny)) rr = rd[rr];
  57. int le = yy-max(y,ny);
  58. LL d = d1(ll+1,rr-1,x,le);
  59. as1 -= d; ans -= d;
  60. yy = ny;
  61. }
  62. ld[x] = ll; rd[x] = rr;
  63. a[x] = y;
  64. return ;
  65. }
  66. int main() {
  67. freopen("fish.in","r",stdin);
  68. freopen("fish.out","w",stdout);
  69. R = read();C = read();
  70. n = read();
  71. rd[0] = n+1;ld[R+1] = 0;
  72. a[0] = a[R+1] = -1;
  73. for(int i = 1;i <= R;i ++) {
  74. a[i] = C;
  75. ld[i] = i-1; rd[i] = i+1;
  76. }
  77. for(int i = 1;i <= n;i ++) {
  78. s = read();o = read();
  79. bu[o-1].push_back(s);
  80. }
  81. for(int Y = C-1;Y >= 0;Y --) {
  82. as1 += (R+1)*1ll*R/2ll;
  83. ans += as1;
  84. for(int i = 0;i < (int)bu[Y].size();i ++) {
  85. add(bu[Y][i],Y);
  86. }
  87. }
  88. LL ful = (R+1)*1ll*R/2ll * (C+1)*1ll*C/2ll;
  89. printf("%lld\n",ful-ans);
  90. return 0;
  91. }

【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)的更多相关文章

  1. bzoj2658: [Zjoi2012]小蓝的好友(mrx)

    太神辣 treap的随机键值竟然能派上用场.. 要用不旋转的treap来进行维护区间信息 #include<cstdio> #include<cstring> #include ...

  2. 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线

    [BZOJ2658][Zjoi2012]小蓝的好友(mrx) Description 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的 ...

  3. @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ...

  4. BZOJ2658 ZJOI2012 小蓝的好友(treap)

    显然转化为求不包含关键点的矩形个数.考虑暴力,枚举矩形下边界,求出该行每个位置对应的最低障碍点高度,对其建笛卡尔树,答案即为Σhi*(slson+1)*(srson+1),即考虑跨过该位置的矩形个数. ...

  5. 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告

    P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...

  6. [ZJOI2012]小蓝的好友

    https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...

  7. YYHS-Super Big Stupid Cross(二分+扫描线+平衡树)

    题目描述 “我是超级大沙茶”——Mato_No1 为了证明自己是一个超级大沙茶,Mato 神犇决定展示自己对叉(十字型)有多么的了 解. Mato 神犇有一个平面直角坐标系,上面有一些线段,保证这些线 ...

  8. P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】

    正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ...

  9. 【LOJ2586】【APIO2018】选圆圈 CDQ分治 扫描线 平衡树

    题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1,c_2,\ldots,c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \ ...

随机推荐

  1. easy-captcha生成验证码

    通常一些网页登陆时,都需要通过验证码去登录: 生成验证码的方法有很多,这次分享一个验证码即能是汉字的 又能是算术的. 首先maven坐标: <dependency> <groupId ...

  2. JS:Array

    js有五种基本数据类型:string,number,boolean,null,undefined 一种引用类型,包括:1.Object类型:2.Function类型:3.Array类型:4.RegEx ...

  3. Vue引入vuetify框架你需要知道的几点

    1.命令行安装 npm install vuetify --save 2.在src目录中创建一个名为的文件夹plugins在里面,添加一个vuetify.js文件.代码如下 import Vue fr ...

  4. vue 封装弹窗组件注意

    父组件 <template> <div> <p @click="onDelete"> 打开 </p> <!-- 弹框 --&g ...

  5. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

  6. -bash: /usr/local/maven/apache-maven-3.8.1/bin/mvn: 权限不够

    chmod a+x /usr/local/maven/apache-maven-3.8.1/bin/mvn

  7. 抓包整理外篇——————autoResponder、composer 、statistics [ 三]

    前言 经过了前文的介绍的部分已经能够为自己抓包提供一个舒适的环境了,但是舒服的拿到我们的包后,可能有些需求还是难以搞定,fiddler 提供了我们一些其他模块,让我们工作轻松,请往下看. 正文 aut ...

  8. 异常概念&异常体系和异常分类

    异常概念 异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处 ...

  9. 挑战30天写操作系统-day2-汇编语言学习与Makefile入门

    1.介绍文本编辑器 这里,我们直接采用自己windows电脑自带的文本编辑器即可以完成制作要求 2.继续开发 下面先是对昨天使用的helloos.nas文件内容进行详细解释 ; hello-os ; ...

  10. 【一知半解】AQS

    什么是AbstractQueuedSynchronizer(AQS) 字面意思是抽象队列同步器,使用一个voliate修饰的int类型的同步状态,通过一个FIFO队列完成资源获取的排队工作,把每个参与 ...