BZOJ 2658 小蓝的好友
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2658
题意:给出一个n*m的格子。某些格子中有障碍。求包含至少一个障碍的矩形有多少个?
思路:我们求空白矩形的个数。
从上到下一行一行计算,每到达一行,计算以该行为底的空白矩形个数。我们只需要知道每列向上延伸的最大距离。

这个可以看做是一棵树

我们只需要记录每个的高度即可。
那么每次增加一行,若整行都没有障碍,则根节点的高度增加1.否则,障碍将树分为若干子树。这个操作可以用fhq treap实现,即通过树的分离和合并实现所有操作。
合并两个子树AB时,要求A的所有元素小于B。或者将A设为B的左孩子,或者将B设为A的右孩子。这个操作比较简单。
对于分离操作,用split(now,x,y,K)表示,将now为根的子树的前K个孩子分离,分开后的两个子树的根分别是x,y
设K=5

分离红色圈住的5个节点,过程如下:
(这个图来自http://hi.baidu.com/wdxertqdtscnwze/item/7b6a9419be7c68cd756a8498)


const int N=100005;
struct node
{
int c[2],h,det,size;
i64 ans;
void add(int x)
{
h+=x;
det+=x;
}
};
node a[N];
int root;
#define C2(x) ((x)*((x)+1)/2)
void pushUp(int t)
{
if(!t) return;
a[t].size=1;
a[t].ans=0;
for(int i=0;i<2;i++) if(a[t].c[i])
{
int p=a[t].c[i];
a[t].size+=a[p].size;
a[t].ans+=a[p].ans;
a[t].ans+=(i64)(a[p].h-a[t].h)*C2(a[p].size);
}
}
void pushDown(int t)
{
if(!t||!a[t].det) return;
if(a[t].c[0]) a[a[t].c[0]].add(a[t].det);
if(a[t].c[1]) a[a[t].c[1]].add(a[t].det);
a[t].det=0;
}
pair<int,int> split(int u,int k)
{
if(!u) return MP(0,0);
pushDown(u);
if(a[a[u].c[0]].size+1<=k)
{
k-=a[a[u].c[0]].size+1;
pair<int,int> tmp=split(a[u].c[1],k);
a[u].c[1]=tmp.first;
pushUp(u);
return MP(u,tmp.second);
}
else
{
pair<int,int> tmp=split(a[u].c[0],k);
a[u].c[0]=tmp.second;
pushUp(u);
return MP(tmp.first,u);
}
}
int merge(int u,int v)
{
if(!u||!v) return u+v;
pushDown(u);
pushDown(v);
if(a[u].h<a[v].h)
{
a[u].c[1]=merge(a[u].c[1],v);
pushUp(u);
return u;
}
else
{
a[v].c[0]=merge(u,a[v].c[0]);
pushUp(v);
return v;
}
}
pair<int,int> b[N];
int n,m,K;
int main()
{
n=myInt();
m=myInt();
K=myInt();
for(int i=1;i<=K;i++)
{
b[i].first=myInt();
b[i].second=myInt();
}
sort(b+1,b+K+1);
for(int i=1;i<=m;i++)
{
root=merge(root,i);
pushUp(root);
}
int cur=1;
i64 ans=(i64)C2(n)*C2(m);
for(int i=1;i<=n;i++)
{
a[root].add(1);
while(cur<=K&&b[cur].first==i)
{
pair<int,int> tmp1=split(root,b[cur].second-1);
pair<int,int> tmp2=split(tmp1.second,1);
a[tmp2.first].h=0;
root=merge(tmp1.first,tmp2.first);
root=merge(root,tmp2.second);
cur++;
}
ans-=a[root].ans;
ans-=(i64)a[root].h*C2(a[root].size);
}
printf("%lld\n",ans);
}
BZOJ 2658 小蓝的好友的更多相关文章
- @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)
目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ...
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线
[BZOJ2658][Zjoi2012]小蓝的好友(mrx) Description 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的 ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)
题面 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得 ...
- bzoj2658: [Zjoi2012]小蓝的好友(mrx)
太神辣 treap的随机键值竟然能派上用场.. 要用不旋转的treap来进行维护区间信息 #include<cstdio> #include<cstring> #include ...
- BZOJ2658 ZJOI2012 小蓝的好友(treap)
显然转化为求不包含关键点的矩形个数.考虑暴力,枚举矩形下边界,求出该行每个位置对应的最低障碍点高度,对其建笛卡尔树,答案即为Σhi*(slson+1)*(srson+1),即考虑跨过该位置的矩形个数. ...
- [ZJOI2012]小蓝的好友
https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...
- bzoj 2658
首先考虑容斥 我们计算出所有没有点在其中的矩形,然后用所有矩形减去这些矩形即可 然后考虑如何计算没有点在其中的矩形 采用扫描线的思想,从上向下一行一行扫,假设我们扫到的行编号是$a$,然后考虑如果左右 ...
- P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】
正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ...
随机推荐
- zw版【转发·台湾nvp系列Delphi例程】HALCON CheckDifference
zw版[转发·台湾nvp系列Delphi例程]HALCON CheckDifference unit Unit1;interfaceuses Windows, Messages, SysUtils, ...
- SSAS维度上有多个表的注意事项
在Sql Server Analysis Service中维度上有多张表(大于一张表)时,一定要注意将第二张表开始用到维度属性中的KeyColumns下的NullProcessing要设置为Unkno ...
- 【海岛帝国系列赛】No.6 海岛帝国:战争前线
50234237海岛帝国:战争前线 [试题描述] 总指挥官WHT出神入化的计谋虽然大有用武之地,但是聪明的恐怖分子们采取了城市核武器防御系统,可以有效地抵制WHT的炸弹.YSF对此头痛不已,因此 召开 ...
- android 学习随笔四(数据库存储)
SQLite数据库(sqliteexpert工具),sqlite数据库是轻量级数据库,对数据类型要求不是很严格,在数据库中处理是按verchar类型处理,一般定义表字段时还是要求严格按照数据类型定义, ...
- !important------至高无上的宝剑
如上图,不同来源的两个样式,第一个样式设置了font-weight,第二个没有,浏览器会把它叠加在一起,即浏览器会把各个零散的整合成一个整体.第一个样式color:red,第二个样式color:blu ...
- 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘
一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DO ...
- html5 canvas 笔记一(基本用法与绘制图形)
<canvas> 元素 <canvas id="tutorial" width="150" height="150"> ...
- Java常用jar包用途
Java常用jar包用途: USAGE INDEX JAR NAME USAGE 1 ASM asm-2.2.3.jar ASM字节码库 2 ASM asm-commons-2.2.3.jar ASM ...
- 2>&1 的用法说明
经常关注linux脚本的人,一定看到过 2>&1 这样的用法,最初一定不明白其中的含义以及为什么是这样的一种组合.昨天偶然间再次看到了这个 2>&1 的写法,遂下决心搞明白 ...
- RabbitMQ 基本概念介绍-----转载
1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...