[Luogu4230]连体病原体
sol
很好想+很好写的一道题,然而比赛中我还是没有切掉qaq。
LCT
枚举左端点\(i\),向右移动右端点指针\(j\)找到第一个成环的位置。此时\([i,j],[i,j+1]...[i,m]\)都是合法答案。可见就是在区间\([i,j]\)上区间加\(m-j+1\),再在\([j+1,m]\)上加上一个等差数列\(m-j,m-j-1...1\)
等差数列直接二阶差分最后做两次前缀和即可。
以下内容摘自出题人题解
时间复杂度O(nlogn) ,期望得分100分,实际得分75~100分
FAQ:为什么我写了LCT却只得了75分/90分
A:因为findroot后要splay才能保证复杂度,不splay的都被我卡到O(n^2)啦!
发现自己以前写的LCT从来没有在findroot后splay。细思极恐。
code
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1000005;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
int m,u[N],v[N],o[N<<1],fa[N],ch[2][N],rev[N],Stack[N],top,t1[N],t2[N];
bool son(int x){return x==ch[1][fa[x]];}
bool isroot(int x){return x!=ch[0][fa[x]]&&x!=ch[1][fa[x]];}
void reverse(int x){if(!x)return;swap(ch[0][x],ch[1][x]);rev[x]^=1;}
void pushdown(int x){if(!rev[x])return;reverse(ch[0][x]);reverse(ch[1][x]);rev[x]=0;}
void rotate(int x)
{
int y=fa[x],z=fa[y],c=son(x);
ch[c][y]=ch[c^1][x];if (ch[c][y]) fa[ch[c][y]]=y;
fa[x]=z;if (!isroot(y)) ch[son(y)][z]=x;
ch[c^1][x]=y;fa[y]=x;
}
void splay(int x)
{
Stack[top=1]=x;
for (int y=x;!isroot(y);y=fa[y]) Stack[++top]=fa[y];
while (top) pushdown(Stack[top--]);
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y)) son(x)^son(y)?rotate(x):rotate(y);
}
void access(int x){for (int y=0;x;y=x,x=fa[x]) splay(x),ch[1][x]=y;}
void makeroot(int x){access(x);splay(x);reverse(x);}
int findroot(int x){access(x);splay(x);while(ch[0][x])x=ch[0][x];splay(x);return x;}
void split(int x,int y){makeroot(x);access(y);splay(y);}
void link(int x,int y){makeroot(x);fa[x]=y;}
void cut(int x,int y){split(x,y);ch[0][y]=fa[x]=0;}
int main()
{
m=gi();
for (int i=1;i<=m;++i) u[i]=gi(),v[i]=gi();
for (int i=1,j=1;i<=m;cut(u[i],v[i]),++i)
{
while (j<=m&&findroot(u[j])!=findroot(v[j])) link(u[j],v[j]),++j;
if (j<=m) t1[i]+=m-j+1,t2[j+1]--;
}
for (int i=1;i<=m;++i) t2[i]+=t2[i-1];
for (int i=1;i<=m;++i) t1[i]+=t1[i-1],t2[i]+=t2[i-1];
for (int i=1;i<=m;++i) printf("%d ",t1[i]+t2[i]);
return 0;
}
[Luogu4230]连体病原体的更多相关文章
- LCT总结
LCT总结 类比树剖,树剖是通过静态地把一棵树剖成若干条链然后用一种支持区间操作的数据结构维护(比如线段树.树状数组),而LCT是动态地去处理这个问题. 大家都知道树剖用线段树维护,而LCT用\(sp ...
- [luogu P4230]连环病原体
[luogu P4230] 连环病原体 题意 给定一个长度为 \(n\) 的边序列, 当这个序列的一个子区间内的边都加入图中时产生了环则称其为"加强区间", 求序列中的每条边在多少 ...
- Sass中连体符(&)的运用
在CSS中,这种想法是无法实现的,但在Sass中,可以轻松的通过连体符&来实现.这也是我们今天要说的. 我们先来回忆一下,CSS中常见的一组样式: /*页面中链接的颜色*/ a {clolor ...
- vim格式化代码实际上就是 "缩进代码", 命令是等号=
vim格式化代码实际上就是 "缩进代码", 命令是等号= 格式化就是 vim 根据 文件的类型, 自动的对代码进行 缩进 缩进的类型有多种, 都是用等号命令: = 全部格式化 : ...
- Building Modern Web Apps-构建现代的 Web 应用程序(一些感想)
<iframe src="http://channel9.msdn.com/Series/MVA-China/Web20140611A01/player?h=540&w=960 ...
- 小菜学习设计模式(四)—原型(Prototype)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
- iOS之UI--富文本总结
文章内容大纲 1.NSMutableAttributedString的基本使用 2.NSMutableAttributedString的简易封装 3.使用开源代码GOBMarkupPaser处理富文本 ...
- iOS --NSAttributedString
字符属性可以应用于 attributed string 的文本中. 文/iOS_成才录(简书作者) 原文链接:http://www.jianshu.com/p/03a741246737 著作权归作者所 ...
- 精通Web Analytics 2.0 (6) 第四章:点击流分析的奇妙世界:实际的解决方案
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第四章:点击流分析的奇妙世界:实际的解决方案 到开始实际工作的时候了.哦耶! 在本章中,您将了解到一些最重要的网络分析报告,我将 ...
随机推荐
- 让我们一起摇摆 Turnipbit体感遥控车
相信大家对Microbit是非常熟悉的,而今天我们做的这个小玩具所用的核心板是Turnipbit,是基于 Microbit开发的一块适合儿童适用的板卡.基本使用原理是一样的,这里就不多介绍了,代码这方 ...
- a:hover 等伪类选择器
a.random:hover{ color:#64FFDA; font-size:120%; } //选择的是class="random"的<a>标签. a#s ...
- 利用UICollectionView实现列表和宫格视图的切换
很多时候我们需要列表和宫格视图的来回切换,就像苹果的天气应用一样,我之前见过一个用tableview和collectionview来实现这种效果的,我本人不太喜欢这个,那么有没有更好的方法呢?答案是: ...
- golang使用http client发起get和post请求示例
[转自 http://www.01happy.com/golang-http-client-get-and-post/ ] get请求 get请求可以直接http.Get方法,非常简单. 1 2 3 ...
- InputStream中通过mark和reset方法重复利用缓存
通过缓存InputStream可重复利用一个InputStream,但是要缓存一整个InputStream内存压力可能是比较大的.如果第一次读取InputStream是用来判断文件流类型,文件编码等用 ...
- centos/linux下的安装git
1.下载git wget https://github.com/git/git/archive/v2.14.1.zip 2.安装依赖 sudo yum -y install zlib-devel op ...
- maven 在pom文件下配置默认的jdk版本
在pom.xml中加入这段代码就可以了 <!-- 设置默认的jdk --> <profiles> <profile> <id>jdk1.7</id ...
- mac下使用mysql控制台命令行
命令行中输入 open .bash_profile 然后将 alias mysql=/usr/local/mysql/bin/mysqlalias mysqladmin=/usr/local/mysq ...
- 合唱团 (线性dp)
题意:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积 ...
- js处理时间戳显示的问题
function getDate(tm){ ); var year = date.getFullYear(); var month = date.getMonth()+1; var day = dat ...