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 ...
随机推荐
- P2P(WFD)之RegClass *****************************TBD
三个Action Frame的IE会有带上RegClass的信息 Listen Channel element, Channel List element, Operation Channel ele ...
- fetch_array()与fetch_assoc()的用法
fetch_array()与fetch_assoc()用起来没有什么大的差别,主要是怎么用?fetch_array()如果单独作为while的条件,则能够取出结果集中的所有结果.如果单独作用于结果集, ...
- Java IO 之 FileFilter与FilenameFilter
FileFilter与FilenameFilter可以实现对文件的过滤,他们都是接口,具体的过滤规则需要我们自己编写 1.FileFilter package org.zln.io.file; imp ...
- 【bzoj2768/bzoj1934】[JLOI2010]冠军调查/[Shoi2007]Vote 善意的投票 最小割
bzoj2768 题目描述 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教育学院进行了一次大规模的调查,调查的内容就是关 ...
- BZOJ3242 [Noi2013]快餐店 【环套树 + 单调队列dp】
题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap
一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...
- Swing中使用UIManager批量自定义单一JComponent组件默认属性
最近在研究Swing,被它的复杂性气的快吐血了,刚才本打算把JFrame的背景色换成白底,结果发现事情没想象中那么顺利,调用setBackground完全没有效果,猛然醒悟到JPanel本身是带不透明 ...
- JQuery选择器$()的工作原理浅析
每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为 ...
- 解决es6中webstrom不支持import的一个简单方法
代码如下: export_one.js的代码如下: export function one() { console.log('one'); } export function two() { cons ...
- python 一些乱七八糟的东西
import random import os import sys import re class _is: def __init__(self,reg): self.cr=re.compile(r ...