看到合肥赛区的题目都是泪啊,期末考完了来补几道

公正来说,这道题我考场确实写不出来,因为我的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的更多相关文章

  1. hdu5967数学找规律+逆元

    Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. LCT专题练习

    [bzoj2049]洞穴勘测 http://www.cnblogs.com/Sdchr/p/6188628.html 小结 (1)LCT可以方便维护树的连通性,但是图的连通性的维护貌似很麻烦. [bz ...

随机推荐

  1. hdu2421(数学,因式分解素数筛)

    Xiaoming has just come up with a new way for encryption, by calculating the key from a publicly view ...

  2. HDU 2175 汉诺塔IX

    http://acm.hdu.edu.cn/showproblem.php?pid=2175 Problem Description 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根 ...

  3. java线程(6)——线程池(下)

    上篇博客java线程(5)--线程池(上)介绍了线程池的基本知识,这篇博客我们介绍一下常用的ThreadPoolExecutor. 定义 类图关系: ThreadPoolExecutor继承了Abst ...

  4. 【PHP】- include、require、include_once 和 require_once的区别

    1.include:会将指定的档案读入并且执行里面的程序.      被导入的档案中的程序代码都会被执行,而且这些程序在执行的时候会拥有和源文件中呼叫到 include() 函数的位置相同的变量范围( ...

  5. can be found for element 'tx:annotation-driven'

    错误描述: ERROR [ContainerBackgroundProcessor[StandardEngine[Catalina]]] (ContextLoader.java:308) - Cont ...

  6. 【bzoj1452】[JSOI2009]Count 二维树状数组

    题目描述 输入 输出 样例输入 样例输出 1 2 题解 二维树状数组 一开始没看到 1≤c≤100 ,想到了主X树和X块,结果发现c的范围那么小... 二维树状数组水题,和一维的一样,向上修改,向下查 ...

  7. BZOJ1559 [JSOI2009]密码 【AC自动机 + 状压dp】

    题目链接 BZOJ1559 题解 考虑到这是一个包含子串的问题,而且子串非常少,我们考虑\(AC\)自动机上的状压\(dp\) 设\(f[i][j][s]\)表示长度为\(i\)的串,匹配到了\(AC ...

  8. 模拟赛 yjqa

    考场上怕是石乐志. 状态设计还是很自然的,求什么设什么. f[i]表示前i个人安排好,电梯最早回到0层的时间 转移的话,枚举上一次最后一个带走的是谁 f[i]=min(max(f[j],t[i])+2 ...

  9. 用JavaScript实现一个简单的树结构

    数据源用数组混json结构,实现了基本的功能.效率一般,跟 dhtree 梅花雪树对比了下,都差不多. (ps感觉比dhtree快点,跟梅花雪树差不多,个人测试) 这个实现树的原理是根据json,不断 ...

  10. sqlplus 几个命令:

    sqlplus 几个命令: 在sys,system,sysman,scott四个用户权限中,scott用户最低. 其权限依次从高到低. cmd进入sqlplus sqlplus 登录命令: 登录sys ...