https://www.luogu.org/problemnew/show/P2611

题解

\(n\times m\)肯定过不去。。

我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵。

然后我们枚举每一行,令这一行每个点的权值为从这点向上的极大不包含障碍点的连续段。

然后对这个序列建立笛卡尔树,那么答案为:
\[ f[x]=(h[x]-h[fa[x]])*\frac{szie[x]*(size[x]+1)}{2} \]
我们的笛卡尔树上的的每个节点都要维护一个这样的信息。

现在我们还需要扫描每一行,动态维护这颗笛卡尔树。

如果这行没有障碍点,我们整体加个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;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10798060.html

[ZJOI2012]小蓝的好友相关推荐

  1. 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)

    题面 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得 ...

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

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

  3. [2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

    文章目录 CF1251C Minimize The Integer acwing164:可达性统计 Facebook Hacker Cup 2016 Round 1 Boomerang Tournam ...

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

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

  5. bzoj 2656: [Zjoi2012]数列(sequence)(简单高精度模板2.0)

    2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 1663  Solved: 860 [Subm ...

  6. 【ZJOI2012】【BZOJ2657】旅游(journey)

    Description 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示 ...

  7. Bzoj2656 [Zjoi2012]数列(sequence)

    Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 1448  Solved: 762 [Submit][Status][Discuss] Descript ...

  8. [bzoj2229][Zjoi2011]最小割

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点 ...

  9. 【BZOJ2229】【ZJOI2011】最小割

    冷门知识点-- 原题: 小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同 ...

  10. Python 微信机器人-通过wxpy库向指定名称的好友发送微信消息实例演示

    原来用的是 itchat 库,想向好友发送消息只能通过 UserName 这个关键词来发送,但是这个 UserName 每次重新登录后都是变的,根本没法定位到指定好友,一般好友的备注或微信名是 Nic ...

最新文章

  1. [android] 从gallery获取图片
  2. shiro系列二、身份验证和授权
  3. Win2008 R2 RemoteApp深度体验之四,RemoteApp程序测试
  4. 云盘存储 教学反思_对设计训练的设计:以建筑工房工作模型课题的教学实验为例对设计训练方法论的反思...
  5. 解决Kali Linux XFCE桌面Tab无法补全
  6. cas无法使用_一文彻底搞懂CAS实现原理
  7. Blazor VS React / Angular / Vue.js
  8. 【知乎摘要】女生婚前应该清楚男友哪些方面了才能嫁给他
  9. 链表和顺序表的一些区别
  10. MySQL索引常用算法
  11. VMware日志收集方法总结
  12. 混乱的MVC,.NET非要MVC不可么?
  13. X64上的IIS調用32位的DLL方法
  14. C++ 如何释放std::function中绑定的对象
  15. c语言timer linux 回调函数_SetTimer 与 回调函数
  16. 在百度地图中获取当前点击 位置的 经纬度 和 地址信息
  17. CLASST T 使用
  18. nyoj-506-洗澡
  19. 京东图书架构设计有感
  20. 用C语言实现shell

热门文章

  1. 什么将计算机连接到网络,Windows 8.1官方教程:将电脑连接到网络-windows技巧-电脑技巧收藏家...
  2. zerorpc java_Zerorpc 支持暴露多个远程Api接口类
  3. Excel插入多列相同数据
  4. MAC maven 安装和配置
  5. JRuby--Java和Ruby的强强联合 Centos7.X
  6. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_19-CMS前端页面查询开发-页面原型-Table组件测试...
  7. 阶段3 2.Spring_10.Spring中事务控制_4 spring中事务控制的一组API
  8. 阶段3 2.Spring_03.Spring的 IOC 和 DI_9 spring的依赖注入
  9. 阶段3 1.Mybatis_02.Mybatis入门案例_1.mybatis的入门
  10. Python编程学习笔记:列表