[ZJOI2012]小蓝的好友
https://www.luogu.org/problemnew/show/P2611
题解
\(n\times m\)肯定过不去。。
我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵。
然后我们枚举每一行,令这一行每个点的权值为从这点向上的极大不包含障碍点的连续段。
然后对这个序列建立笛卡尔树,那么答案为:
\]
我们的笛卡尔树上的的每个节点都要维护一个这样的信息。
现在我们还需要扫描每一行,动态维护这颗笛卡尔树。
如果这行没有障碍点,我们整体加个1就好了,这个可以直接打标记。
对于障碍点,相当于这个位置的值变成了0,那么我们把这个点旋转上来就好了,通过手玩我们可以发现\(rotate\)操作不会破坏除了这个点以外的其他点的笛卡尔树结构,于是我们可以一直\(rotate\)把这个点转上去,顺便更新一下答案就好了,因为是随机的数据,所以每次期望操作次数是\(log\)的。
注意如果按照上面的\(\Delta h\)那样算贡献的话如果一个点的父亲改变了的话这个点需要重新\(pushup\)一次。
代码
#include<bits/stdc++.h>
#define N 100009
#define ls tr[x][0]
#define rs tr[x][1]
using namespace std;
typedef long long ll;
vector<int>vec[N];
vector<int>::iterator it;
int tr[N][2],fa[N],size[N],h[N],la[N],n,m,num,rot;
ll dp[N],ans;
inline ll rd(){
	ll x=0;char c=getchar();bool f=0;
	while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return f?-x:x;
}
inline ll calc(ll x){return x*(x+1)/2;}
inline bool ge(int x){return tr[fa[x]][1]==x;}
inline void pushup(int x){
	size[x]=size[ls]+size[rs]+1;
	dp[x]=dp[ls]+dp[rs]+1ll*(h[x]-h[fa[x]])*calc(size[x]);
}
inline void rotate(int x){
	int y=fa[x],o=ge(x);
	tr[y][o]=tr[x][o^1];fa[tr[y][o]]=y;
	if(fa[y])tr[fa[y]][ge(y)]=x;fa[x]=fa[y];
	fa[y]=x;tr[x][o^1]=y;
	if(tr[y][o])pushup(tr[y][o]);pushup(y);pushup(x);
}
inline void add(int x,int y){
	h[x]+=y;la[x]+=y;
	pushup(x);
}
inline void pushdown(int x){
	if(la[x]){
		if(ls)add(ls,la[x]);
		if(rs)add(rs,la[x]);
		la[x]=0;
	}
}
void _pushdown(int x){
	if(fa[x])_pushdown(fa[x]);
	pushdown(x);
}
int build(int l,int r){
	if(l>r)return 0;
	int x=(l+r)>>1;
	ls=build(l,x-1);rs=build(x+1,r);
	if(ls)fa[ls]=x;if(rs)fa[rs]=x;
	size[x]=size[ls]+size[rs]+1;
	return x;
}
void dfs(int x){
	pushdown(x);
	if(ls)dfs(ls);
	cout<<x<<" "<<ls<<" "<<rs<<" "<<h[ls]<<" "<<h[rs]<<" "<<h[x]<<" "<<dp[x]<<endl;
	if(rs)dfs(rs);
}
int main(){
	n=rd();m=rd();num=rd();
	rot=build(1,m);
	for(int i=1;i<=num;++i){
		int x,y;
		x=rd(),y=rd();
		vec[x].push_back(y);
	}
	for(int i=1;i<=n;++i){
		add(rot,1);
		for(it=vec[i].begin();it!=vec[i].end();++it){
			int x=*it;
			_pushdown(x);
			while(fa[x])rotate(x);
			h[x]=0;
			if(ls)pushup(ls);if(rs)pushup(rs);
			pushup(x);
			rot=x;
		}
		ans+=dp[rot];
	}
	printf("%lld",calc(n)*calc(m)-ans);
	return 0;
}
[ZJOI2012]小蓝的好友的更多相关文章
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线
		[BZOJ2658][Zjoi2012]小蓝的好友(mrx) Description 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的 ... 
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
		P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ... 
- @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)
		目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ... 
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)
		题面 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得 ... 
- bzoj2658: [Zjoi2012]小蓝的好友(mrx)
		太神辣 treap的随机键值竟然能派上用场.. 要用不旋转的treap来进行维护区间信息 #include<cstdio> #include<cstring> #include ... 
- BZOJ2658 ZJOI2012 小蓝的好友(treap)
		显然转化为求不包含关键点的矩形个数.考虑暴力,枚举矩形下边界,求出该行每个位置对应的最低障碍点高度,对其建笛卡尔树,答案即为Σhi*(slson+1)*(srson+1),即考虑跨过该位置的矩形个数. ... 
- BZOJ 2658 小蓝的好友
		题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2658 题意:给出一个n*m的格子.某些格子中有障碍.求包含至少一个障碍的矩形有多少 ... 
- P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】
		正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ... 
- bzoj AC倒序
		Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ... 
随机推荐
- 关于i18n
			现在工作主要负责小程序端,很少负责backend.最近的一个任务是配置多语言.因为一开始都是写死的中文,现在需要把那些变成英文. 狂搜了一波,其实网上的方法都不怎好.(可能就是一开始看的时候觉得好.) ... 
- 2.3 js基础--DOM
			一.javascript组成 ECMAScript:核心解释器[为我们提供好了最基本的功能:变量声明.函数.语法.运算]. 兼容性:完全兼容. DoM:文档对象 ... 
- [Matlab] figure
			figure只能设置序号 不能设置title 而stem和plot可以设置title 
- Linux Kernel文件系统写I/O流程代码分析(一)
			Linux Kernel文件系统写I/O流程代码分析(一) 在Linux VFS机制简析(二)这篇博客上介绍了struct address_space_operations里底层文件系统需要实现的操作 ... 
- html结构内容拾忆
			文本格式化: <b>This text is bold</b><!--定义粗体文本.--> <strong>This text is strong< ... 
- Javascript怎么跳出循环,嵌套循环。
			今天要实现一个功能,在数组a中的每一项,对应数组b中的每一项,如果对应上了就给数组b的checked增加ture属性,如果查找不到就给数组b的checked增加false属性. 如果有哪里写的不对欢迎 ... 
- solidity合约面向对象
			1. 属性[状态变量]的访问权限 public internal[合约属性默认的权限] private 说明:属性默认访问全向为internal,internal和private类型的属性,外部是 ... 
- Windows server 搭建ftp服务器
			1.安装ftp 2.端口端口21和20的入出端口 3.点击IIS 服务器证书 4.FTP界面上选择“FTP身份验证”——>“基本身份验证”–>”启用” 5.FTP界面选择 “FTP授权规则 ... 
- 利用JS提交表单的几种方法和验证(必看篇)
			第一种方式:表单提交,在form标签中增加onsubmit事件来判断表单提交是否成功 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <scr ... 
- 操作系统-Interrupts
