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 ...
随机推荐
- 夺命雷公狗---微信开发53----网页授权(oauth2.0)获取用户基本信息接口(3)实现世界留言版
前面两节课我们讲的是base型的授权了,那么现在我们开始Userinfo型授权, 先来看下我们的原理图 我们这节课来做一个 世界留言版 系统 1..首先我还是在微信测试平台那里设置好回调页面的域名 2 ...
- java 操作excel 文件
JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...
- Android SDK 安卓失败 提示: “Failed to fetch URL…” 的错误提示
解决方法: 1. 打开Tools 选择 options 将 第一个复选框勾上. (尝试一下,如果还是失败,参考2) 2. 打开本地host 文件, 在最后一行添加 ...
- java 网络编程(五)----TCP进阶篇上传文本文件
设计需求:从客户端上传txt文件到服务器,服务端收到文件后,发送消息给客户端接收完成. 1. 服务器端: public class UpLoadFileServer { public static v ...
- [php]使用会话session
<?php /* cookie - 在客户端上存储少了信息(cookie) session(会话) - 解决cookie大小限制/数量/其他 setcookie() - 设置cookie 在客户 ...
- VisualSVNServer启动失败错误处理
VisualSVNServerServer service failed to start: 服务已返回特定的服务器错误代码:(0x8007042a) Please check Vis ...
- JSP/Servlet 中的汉字编码问题
JSP/Servlet 中的汉字编码问题 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区 ...
- flex 加载arcgis 的地图json
var fs:FeatureSet=FeatureSet.fromJSON(JSONUtil.decode(e.result.toString())); for each(var gra:Graphi ...
- WWDC 2016 总结
一年一次的WWDC,是开发者充值信仰的时刻,今天你的信仰充值了吗?欢迎在本文下面留言吐槽. 有外媒称,这届WWDC苹果将“fun”伪装成“innovation”,的确,看看另两家老对手,微软有黑科技H ...
- Docker Centos安装Redis以及问题处理
之前一篇文章 Redis安装及主从配置 介绍了redis的安装配置,另一篇文件介绍了 Docker Centos安装Openssh .今天将两篇文件结合一下——在Docker Centos环境下搭建r ...