【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线
【BZOJ2658】[Zjoi2012]小蓝的好友(mrx)
Description
Input
Output
Sample Input
1 2
2 3
3 5
4 1
Sample Output
HINT
【数据范围】
对于100%的数据,R,C<=40000,N<=100000,资源点的位置两两不同,且位置为随机生成。
题解:第一思路一定是补集转化,我们改求不包含黑点的矩形个数。然后考虑枚举矩形的底边所在行,考虑这一行的贡献是什么。
我们将这一行中,每一列上面遇到的第一个黑点到这一行的距离定义为这一列的高度。然后我们对这一行中,所有列的高度建出一棵笛卡尔树。假设树上第i个节点的子树大小是siz[i],高度是h[i],那么这个点对答案的贡献就是${siz\times (siz+1) \over 2}\times(h[i]-h[fa])$。
这样做的复杂度是O(Rn)的。但是我们发现数据是随机的,随机数据有什么性质?随机序列的笛卡尔树的树高是O(logn)的,并且笛卡尔树其实是一棵Treap!所以我们可以考虑用Treap维护笛卡尔树。当我们向下平移一行时,首先所有点的高度+1,这个打标记就好;然后这一行可能冒出来一些黑点,我们将这些黑点旋转上来,然后将高度变成0即可。我们还要动态维护一下所有点的${siz\times (siz+1) \over 2}\times(h[i]-h[fa])$,这个比较麻烦,需要注意一下细节。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=100010;
typedef long long ll;
vector<int> px[maxn];
vector<int>::iterator it;
ll ans;
int R,C,n,rt;
struct node
{
int ch[2],siz,fa,h,tag;
ll sum;
}s[maxn];
inline ll c(const ll &x) {return x*(x+1)>>1;}
inline void add(int x,int y) {s[x].h+=y,s[x].tag+=y;}
inline void pushdown(int x)
{
if(s[x].tag)
{
if(s[x].ch[0]) add(s[x].ch[0],s[x].tag);
if(s[x].ch[1]) add(s[x].ch[1],s[x].tag);
s[x].tag=0;
}
}
inline void pushup(int x)
{
s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
s[x].sum=s[s[x].ch[0]].sum+s[s[x].ch[1]].sum+c(s[x].siz)*(s[x].h-s[s[x].fa].h);
}
void updata(int x)
{
if(x!=rt) updata(s[x].fa);
pushdown(x);
}
inline void rotate(int x)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(y==rt) rt=x;
else s[z].ch[y==s[z].ch[1]]=x;
s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y,pushdown(s[x].ch[d^1]),pushup(s[x].ch[d^1]);
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
int build(int l,int r)
{
if(l>r) return 0;
int x=(l+r)>>1;
s[x].ch[0]=build(l,x-1),s[x].ch[1]=build(x+1,r),s[x].siz=r-l+1;
if(s[x].ch[0]) s[s[x].ch[0]].fa=x;
if(s[x].ch[1]) s[s[x].ch[1]].fa=x;
return x;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
R=rd(),C=rd(),n=rd();
int i,a,b;
for(i=1;i<=n;i++) a=rd(),b=rd(),px[b].push_back(a);
rt=build(1,R);
for(i=C;i>=1;i--)
{
add(rt,1),pushup(rt);
for(it=px[i].begin();it!=px[i].end();it++)
{
a=*it,updata(a);
while(a!=rt) rotate(a);
s[a].h=0;
if(s[a].ch[0]) pushdown(s[a].ch[0]),pushup(s[a].ch[0]);
if(s[a].ch[1]) pushdown(s[a].ch[1]),pushup(s[a].ch[1]);
pushup(a);
}
ans+=s[rt].sum;
}
printf("%lld",c(R)*c(C)-ans);
return 0;
}
【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线的更多相关文章
- bzoj2658: [Zjoi2012]小蓝的好友(mrx)
太神辣 treap的随机键值竟然能派上用场.. 要用不旋转的treap来进行维护区间信息 #include<cstdio> #include<cstring> #include ...
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)
题面 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得 ...
- @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)
目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ...
- BZOJ2658 ZJOI2012 小蓝的好友(treap)
显然转化为求不包含关键点的矩形个数.考虑暴力,枚举矩形下边界,求出该行每个位置对应的最低障碍点高度,对其建笛卡尔树,答案即为Σhi*(slson+1)*(srson+1),即考虑跨过该位置的矩形个数. ...
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- [ZJOI2012]小蓝的好友
https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...
- ☆ [ZJOI2006] 书架 「平衡树维护数列」
题目类型:平衡树 传送门:>Here< 题意:要求维护一个数列,支持:将某个元素置顶或置底,交换某元素与其前驱或后继的位置,查询编号为\(S\)的元素的排名,查询排名第\(k\)的元素编号 ...
- BZOJ 1014 火星人 | 平衡树维护哈希
BZOJ 1014 火星人 题意 有一个字符串,三中操作:在某位置后面插入一个字符.修改某位置的字符.询问两个后缀的最长公共前缀. 题解 看到网上的dalao们都说这道题是平衡树,我就很懵x--平衡树 ...
随机推荐
- GCT之数学公式(几何部分)
一.平面图形 二.空间几何体
- UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字
lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...
- 图解HTTP学习笔记——简单的HTTP协议
简单的HTTP协议 前言 最近在学习Web开发的相关知识,发现<图解HTTP>这本书通俗易懂.所以花时间学习这本书,并记录下学习笔记. 如上图,我们每天都在浏览网页,一般我们都是在浏览器地 ...
- 一分钟理清Vue-cli 代码构建步骤。
1. $ npm install vue -cli -g $ vue init webpack project-name $ cd project-name $ npm install $ npm r ...
- Webkit内核探究【2】——Webkit CSS实现
注:[转载请注明文章来源.保持原样] 出处:http://www.cnblogs.com/jyli/archive/2010/01/31/1660364.html 作者:李嘉昱 CSS在Webkit中 ...
- NSIS 资料
官方 http://nsis.sourceforge.net/Main_Page NSIS官方插件全集 http://az.eliang.com/aq_2013041703.html NSIS 衿华客 ...
- redis sentinels哨兵集群环境配置
# Redis configuration file example. # # Note that in order to read the configuration file, Redis mus ...
- Mac下配置svn服务器
Mac OS X 系统已经内置了svn支持,所以需要做的就只是配置,可以用svnadmin –vsersion(svnserve –version)查看.希望能对 您配置 SVN.进行开发版本控制有所 ...
- kohana 简单使用
声明:基于公司使用的 Kohana 框架写的,不确定是否适用于原生 Kohana 附:Kohana 3 中文手册,传送门:http://www.lampblog.net/kohana3%E4%BD%B ...
- 使用 requests 配置代理服务
(1) 如果我们一直用同一个IP去请求同一个网站上的网页,久了之后可能会被该网站服务器屏蔽,因此我们可以使用代理IP来发起请求,代理实际上指的就是代理服务器(2) 当我们使用代理IP发起请求时,服务器 ...