又一次把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. day31网络编程

    网络编程1. 目标:编写一个C/S架构的软件    C/S: Client(用户端)--------基于网络----------Server(服务端)    B/S: Browser-------基于 ...

  2. asp.net 微信JsSDK

    有时间再整理吧 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S ...

  3. 文件上传:swfupload.js、blueimp-file-upload

    一.swfupload 1.下载swfupload http://code.google.com/p/swfupload/ 2. 3.API  http://www.cnblogs.com/henw/ ...

  4. int和Integer的自动拆箱/装箱相关问题

    java中为没一种基本类型都提供相应的包装类型. byte,short,char,int,long,float,double和boolean Byte,Short,Character,Integer, ...

  5. charles 注册码

    感谢@那时纯真 提供的注册码.Windows和Mac通用. 软件去官网下载安装即可. Registered Name:https://zhile.io License Key: 48891cf209c ...

  6. python中类与对象及其绑定方法的定义

    面向对象编程 什么是面向对象? 面向过程:将需要解决的问题按步骤划分,一步一步完成每一个步骤,而且          步骤之间有联系. 优点:复杂问题可以分步完成 缺点:扩展性很差,维护性差.如果中间 ...

  7. ExecutorService——shutdown方法和awaitTermination方法

    ExecutorService的关闭shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池. 方法简介shutdown方法: ...

  8. java导出excel模板数据

    Java导出excel数据模板,这里直接贴代码开发,流程性的走下去就是步骤: String[] colName=new String[]{"期间","科目代码" ...

  9. Spring再接触 注入类型

    共有三种注入类型 一种是set注入 一种是构造注入 一种是接口注入 最常用的还是set 现在看一下construct 构造注入 在userservice中加入 package com.bjsxt.se ...

  10. Junit介绍以及使用

    在介绍junit之前,把一些知识点提前了解一下 单元测试是一个对单一实体(类或方法)的测试. 测试用例(Test Case)是为某个特殊目标而编制的一组测试输入.执行条件以及预期结果,以便测试某个程序 ...