bzoj3637(lct)
又一次把lct写炸了,硬着头皮终于改对了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
struct node{
int fa,ls,rs,is_root;
}tr[maxn*];
int t,tot[maxn*],sum[maxn*],cnt,last[maxn*],pre[maxn*],to[maxn*];//tot表示这个点连出的虚边子树和;
int n,q,col[maxn],f[maxn];
void add(int x,int y){++t;pre[t]=last[x];last[x]=t;to[t]=y;}
void update(int x){
sum[x]=tot[x];
if(tr[x].ls!=&&tr[x].ls!=n+)sum[x]+=sum[tr[x].ls];
if(tr[x].rs!=&&tr[x].rs!=n+)sum[x]+=sum[tr[x].rs];
}
void rx(int x){
int y=tr[x].fa,z=tr[y].fa;
tr[y].ls=tr[x].rs;
if(tr[x].rs!=&&tr[x].rs!=n+)tr[tr[x].rs].fa=y;
tr[x].rs=y;tr[y].fa=x;
tr[x].fa=z;
if(z!=&&z!=n+&&!tr[y].is_root){
if(tr[z].ls==y)tr[z].ls=x;else tr[z].rs=x;
}
if(tr[y].is_root)tr[y].is_root=,tr[x].is_root=;
update(y);update(x);
}
void lx(int x){
int y=tr[x].fa,z=tr[y].fa;
tr[y].rs=tr[x].ls;
if(tr[x].ls!=&&tr[x].rs!=n+)tr[tr[x].ls].fa=y;
tr[x].ls=y;tr[y].fa=x;
tr[x].fa=z;
if(z&&z!=n+&&!tr[y].is_root){
if(tr[z].ls==y)tr[z].ls=x;else tr[z].rs=x;
}
if(tr[y].is_root)tr[y].is_root=,tr[x].is_root=;
update(y);update(x);
}
void splay(int x){
while(!tr[x].is_root){
int y=tr[x].fa,z=tr[y].fa;
if(tr[y].is_root){if(tr[y].ls==x)rx(x);else lx(x);}
else{
if(tr[z].ls==y&&tr[y].ls==x){rx(y);rx(x);}
else if(tr[z].ls==y&&tr[y].rs==x){lx(x);rx(x);}
else if(tr[z].rs==y&&tr[y].ls==x){rx(x);lx(x);}
else {lx(y);lx(x);}
}
}
}
void ace(int x){
for(int p=;x!=&&x!=n+;x=tr[x].fa){
splay(x);
if(tr[x].rs!=&&tr[x].rs!=n+){
tr[tr[x].rs].is_root=;
tot[x]+=sum[tr[x].rs];
}
if(p!=&&p!=n+){
tot[x]-=sum[p];
}
tr[tr[x].rs=p].is_root=;
update(p=x);
}
}
void link(int x,int y){//x是y的父亲
if(x==||x==n+)return;
ace(x);splay(x);splay(y);
tr[y].fa=x;tr[x].rs=y;tr[y].is_root=;//一开始最后这句丢了;
update(x);
}
void cut(int x,int y){//y是x的父亲
if(y==||y==n+)return;
ace(x);splay(x);tr[tr[x].ls].fa=;tr[tr[x].ls].is_root=;tr[x].ls=;update(x);
}
void dfs(int x,int fa){
for(int i=last[x];i;i=pre[i]){
int v=to[i];
if(v==fa)continue;
link(x,v);f[v]=x;
dfs(v,x);
}
}
int query(int x){
int tmp1=x,tmp2;
if(col[x])x+=n+;
ace(x);
splay(x);
while(tr[x].ls){
x=tr[x].ls;
}
splay(x);
if(col[tmp1])tmp2=x-n-;
else tmp2=x;
if(col[tmp2]!=col[tmp1])return sum[tr[x].rs];
else {return sum[x];}
}
int main(){
int x,y,op;
cin>>n;
for(int i=;i<n;++i){
scanf("%d %d",&x,&y);
add(x,y);add(y,x);
}
for(int i=;i<=n;++i){
sum[i]=tot[i]=;
tr[i].is_root=;
}
for(int i=n+;i<=*n+;++i)tr[i].is_root=;
dfs(,);
cin>>q;
for(int i=;i<=q;++i){
scanf("%d %d",&op,&x);
if(op){
if(col[x]){
cut(x+n+,f[x]+n+);
tot[x+n+]-=;sum[x+n+]-=;
tot[x]+=;sum[x]+=;
link(f[x],x);
}
else{
cut(x,f[x]);
tot[x]-=;sum[x]-=;
tot[x+n+]+=;sum[x+n+]+=;
link(f[x]+n+,x+n+);
}
col[x]^=;
}
else{
printf("%d\n",query(x));
}
}
return ;
}
bzoj3637(lct)的更多相关文章
- 一堆LCT板子
搞了一上午LCT,真是累死了-- 以前总觉得LCT高大上不好学不好打,今天打了几遍感觉还可以嘛= =反正现在的水平应付不太难的LCT题也够用了,就这样好了,接下来专心搞网络流. 话说以前一直YY不出来 ...
- 动态树之LCT(link-cut tree)讲解
动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...
- 在此为LCT开一个永久的坑
其实我连splay都还不怎么会. 今天先抄了黄学长的bzoj2049,以后一定要把它理解了. 写LCT怎么能不%数据结构大神yeweining呢?%%%chrysanthemums %%%切掉大森林 ...
- 【BZOJ2157】旅游 LCT
模板T,SB的DMoon..其实样例也是中国好样例...一开始不会复制,yangyang:找到“sample input”按住shift,按page down.... #include <ios ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
- 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT
竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...
- 【BZOJ3282】Tree LCT
1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性. ..还是得加上好= = #include <iostre ...
- BZOJ2888 资源运输(LCT启发式合并)
这道题目太神啦! 我们考虑他的每一次合并操作,为了维护两棵树合并后树的重心,我们只好一个一个的把节点加进去.那么这样一来看上去似乎就是一次操作O(nlogn),但是我们拥有数据结构的合并利器--启发式 ...
- LCT裸题泛做
①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...
随机推荐
- Android仿淘宝继续上拉进入商品详情页的效果,使用双Fragment动画切换;
仿淘宝继续上拉进入商品详情页的效果,双Fragment实现: 动画效果: slide_above_in.xml <?xml version="1.0" encoding=&q ...
- 爬取WX小程序的数据
方法一: 使用TBS工具,调试跟踪获取URL https://x5.tencent.com/tbs/guide/debug/download.html https://x5.tencent.com/t ...
- 63.1拓展之纯 CSS 创作一个摇摇晃晃的 loader
效果地址:https://scrimba.com/c/cqKv4VCR HTML code: <div class="loader"> <span>Load ...
- C#与Excel的交互示例
//这里加添加一个Excel对象的包装器.就是添加一个引用 using System; using System.Drawing; using System.Collections; using Sy ...
- Resttemplate中设置超时时长方法
为了满足调用需求,需要在使用Resttemplate发送请求时,修改超时时长,网上给出了相关修改方法,代码如下: HttpComponentsClientHttpRequestFactory rf = ...
- JavaScript:BOM&DOM
BOM(Browser Object Model): feature: 1.BOM has no relevant standards. 2.The fundamental object of BOM ...
- GDI+_入门教程【一】
GDI For VisualBasic6.0 [一]文件下载:GDI+ For VB6[一] 简单绘图实例演示百度网盘 1 '以下为作者[vIsiaswx]的教程 '(该教程发布的原地址已无法访问,此 ...
- python入门(七):字符串
1.字符串类型: >>> s="早上好" #str类型的字符串 >>> type(s) <class 'str ...
- 十三、Visitor 访问者设计模式
需求:将数据结果与处理分开 设计原理: 代码清单: Element public interface Element { void accept(Visitor visitor); } Entry p ...
- Intellij IDEA中maven更新不下来pom中的jar包,reimport失效
问题: Intellij IDEA中使用maven reimport包,一直失败 即使我将本地已存在的一个jar包目录删除了,pom文件那里也没飘红提示找不到 解决方法: maven设置中去掉离线下 ...