又一次把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)的更多相关文章

  1. 一堆LCT板子

    搞了一上午LCT,真是累死了-- 以前总觉得LCT高大上不好学不好打,今天打了几遍感觉还可以嘛= =反正现在的水平应付不太难的LCT题也够用了,就这样好了,接下来专心搞网络流. 话说以前一直YY不出来 ...

  2. 动态树之LCT(link-cut tree)讲解

    动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...

  3. 在此为LCT开一个永久的坑

    其实我连splay都还不怎么会. 今天先抄了黄学长的bzoj2049,以后一定要把它理解了. 写LCT怎么能不%数据结构大神yeweining呢?%%%chrysanthemums  %%%切掉大森林 ...

  4. 【BZOJ2157】旅游 LCT

    模板T,SB的DMoon..其实样例也是中国好样例...一开始不会复制,yangyang:找到“sample input”按住shift,按page down.... #include <ios ...

  5. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

  6. 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT

    竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...

  7. 【BZOJ3282】Tree LCT

    1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性. ..还是得加上好= = #include <iostre ...

  8. BZOJ2888 资源运输(LCT启发式合并)

    这道题目太神啦! 我们考虑他的每一次合并操作,为了维护两棵树合并后树的重心,我们只好一个一个的把节点加进去.那么这样一来看上去似乎就是一次操作O(nlogn),但是我们拥有数据结构的合并利器--启发式 ...

  9. LCT裸题泛做

    ①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...

随机推荐

  1. vue里面axios使用post

    let params = new URLSearchParams(); params.append('action', "login"); params.append('user' ...

  2. Python2.x 与 Python3.x 共存

    一.Python2.x 安装 说明:我们先安装python2.x,默认C盘安装即可. 链接: https://pan.baidu.com/s/1yfsVNKmeOR-2C0fK0rPh4A 密码: x ...

  3. 修改java在进程中的映像名

    java小程序用java -jar xxx.jar  启动的进程映像名都是java.exe. 如果启动多个小程序就不好区分,导致监控程序无法定位到具体需要守护的小程序上. 解决办法: 在java安装目 ...

  4. __module__ 和 __class__

    __module__  查看当前方法来之于那个文件 __class__  查看当前方法来之于那个类

  5. Sql入门学习——关系范式

    --------关系 --------范式 一.三种关系 1.一对一关系 关系数据库中,第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关. 2.一 ...

  6. python爬虫之scrapy

    架构概览 本文档介绍了Scrapy架构及其组件之间的交互. 概述 接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示). 下面对每个组件都做了简单介绍,并给出了详 ...

  7. HashMap理解

    HashMap中Capacity为数组长度,默认大小为16,size为元素个数,loadFactor为size/capacity,默认为0.75,当存储的元素个数size大于等于capacity乘以0 ...

  8. CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题

    这是一个基于对话框的程序,对话框上有按钮,还有几个CStatic用来绘图,之前都是好好的,今天改成Unicode版本后,编译正常,运行时CStatic中的图像怎么也不显示,有时候会闪现一次就消失,问题 ...

  9. c#mvc实现登录

    本篇介绍MVC实现登录的方式,如下: 1.通过MVC Form 表单请求实现登录 2.通过AJAX GET 请求MVC Controller 实现登录 3.通过AJAX POST 请求MVC Cont ...

  10. 大数据入门到精通7--对复合value做reducebykey

    培训系列7--对复合value做reduce 1.做基础数据准备 val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigator.csv& ...