hdu5967
看到合肥赛区的题目都是泪啊,期末考完了来补几道
公正来说,这道题我考场确实写不出来,因为我的lct模板不够完美……
我在学习lct的时候不知道为什么代码里加边、删边都是用了一个makeroot的操作
这样我的lct就只能维护无根树而不能维护有根树
但事实上,lct是完全可以维护像这道题有向基环外向树一类有根树
那么怎么加边删边呢?
加边x和x的父亲y:只要先access(x) 再把x所属的Auxiliary Tree的Path parent更改y即可(即splay(x),fa[x]=y)
删除x和x的父亲y:先access(x),splay(x),这时断开Auxiliary Tree上根与左子树的连接即可
当然如果涉及到换根的操作,那还是要用makeroot的,这样lct就能维护有根树了
这道题,我们就是维护森林,成环的边不加(根如果有后继先不加),当遇到修改后继的时候再考虑根的后继是否可以加入,查询即找根是否有后继即可
#include<bits/stdc++.h> using namespace std;
int son[][],a[],fa[];
int n,m,pre;
bool rev[],can[];
bool root(int x)
{
return (son[fa[x]][]!=x&&son[fa [x]][]!=x);
} void rot(int x,int w)
{
int y=fa[x];
if (!root(y))
{
if (son[fa[y]][]==y) son[fa [y]][]=x;
else son[fa[y]][]=x;
}
fa[x]=fa[y];
son[y][w^]=son[x][w];
if (son[x][w]) fa[son[x][w]]=y;
son[x][w]=y; fa[y]=x;
} void splay(int x)
{
while (!root(x))
{
int y=fa[x];
if (root(y))
{
if (son[y][]==x) rot(x,); else rot(x,);
}
else {
if (son[fa[y]][]==y)
{
if (son[y][]==x) rot (y,); else rot(x,);
rot(x,);
}
else {
if (son[y][]==x) rot (y,); else rot(x,);
rot(x,);
}
}
}
} void access(int x)
{
int y=;
while (x)
{
splay(x);
son[x][]=y;
y=x; x=fa[x];
}
} int ask(int x)
{
access(x);
splay(x);
while (son[x][]) x=son[x][];
return x;
} void link(int x,int y)
{
access(x);
splay(x);
fa[x]=y;
} void cut(int x)
{
access(x);
splay(x);
int y=son[x][];
if (!y) return;
fa[y]=son[x][]=;
} void change(int x,int y)
{
if (y==a[x]) return;
int rt=ask(x);
if (can[x]) cut(x);
if (x!=rt&&a[rt]&&ask(a[rt])!=ask (rt))
{
link(rt,a[rt]);
can[rt]=;
}
if (!y) can[x]=;
else {
if (ask(x)!=ask(y))
{
link(x,y);
can[x]=;
}
else can[x]=;
}
a[x]=y;
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; i++)
{
scanf("%d",&a[i]);
can[i]=;
if (a[i])
{
if (ask(a[i])!=ask(i))
{
fa[i]=a[i];
can[i]=;
}
else can[i]=;
}
}
int ch,x,y;
for (int i=; i<=m; i++)
{
scanf("%d",&ch);
if (ch==)
{
scanf("%d%d",&x,&y);
change(x,y);
}
else {
scanf("%d",&x);
y=ask(x);
printf("%d\n",a[y]?-:y);
}
}
}
hdu5967的更多相关文章
- hdu5967数学找规律+逆元
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- LCT专题练习
[bzoj2049]洞穴勘测 http://www.cnblogs.com/Sdchr/p/6188628.html 小结 (1)LCT可以方便维护树的连通性,但是图的连通性的维护貌似很麻烦. [bz ...
随机推荐
- Android调用Java WebSevice篇之二
1.创建Activity. package com.web; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapO ...
- Kafka数据辅助和Failover
数据辅助与Failover CAP理论(它具有一致性.可用性.分区容忍性) CAP理论:分布式系统中,一致性.可用性.分区容忍性最多只可同时满足两个.一般分区容忍性都要求有保障,因此很多时候在可用性与 ...
- Hibernate常用方法之_删除
1.使用session的delete方法 public void deleteUser(User user){ Session session = null; Transaction transact ...
- 【bzoj3000】Big Number 数论
题目描述 给你两个整数N和K,要求你输出N!的K进制的位数. 输入 有多组输入数据,每组输入数据各一行,每行两个数——N,K 输出 每行一个数为输出结果. 样例输入 2 5 2 10 10 10 10 ...
- BZOJ4584 APIO2016赛艇(动态规划+组合数学)
如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...
- [洛谷P1892]团伙
题目大意:有n个人,关系为:朋友的朋友是朋友,敌人的敌人是朋友.如果是朋友就在一个团队内,是敌人就不在,现在给出一关系,问最多有多少团伙.题解:并查集,建反集,如果是朋友,就把他们的并查集合并:如果是 ...
- 洛谷 P1502 窗口的星星 解题报告
P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...
- Ubuntu下安装LNMP之nginx的安装
Nginx 最初是作为一个 Web 服务器创建的,用于解决 C10k 的问题.作为一个 Web 服务器,它可以以惊人的速度为您的数据服务.但 Nginx 不仅仅是一个 Web 服务器,你还可以将其用作 ...
- elemetUi 组件--el-upload
[需求]实现上传Excel文件,在上传到服务器时,还要附加一个参数,在请求上传文件接口前,先要进行文件格式判断. [知识点] 1.el-upload 官方文档中,主要用到了以下属性: data 可选参 ...
- 转:深入理解javascript原型和闭包系列
转自:深入理解javascript原型和闭包系列 从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然 ...