又一次把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. gentoo 图像方面的软件

    图像方面的软件一般包括:查看图像,屏幕截图,图像修改. 查看图像简单的可以安装 feh,但是 feh 一般作为墙纸来用.稍微好一些的是 gqview. 屏幕截图可以用 screengrab,使用的时候 ...

  2. layer.js 中弹框显示不全的问题

    在使用 layer.js 做弹框的时候,遇到在浏览器缩小时,弹框显示不全的问题,如下: 这是不行的,因为我们有的时候想缩小浏览器视窗,但是一旦缩小到一定程度,就会把弹窗的关闭按钮遮住一部分,并且主体弹 ...

  3. maven学习-基本入门用法

    一.下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1.1 ),下载完成后,解压到某个目录(本 ...

  4. ansible自动化运维详细教程及playbook详解

    前言 当下有许多的运维自动化工具( 配置管理 ),例如:Ansible.SaltStack.Puppet.Fabric 等. Ansible 一种集成 IT 系统的配置管理.应用部署.执行特定任务的开 ...

  5. ubuntu环境下,ubuntu16.04装机到nvdia显卡驱动安装、cuda8安装、cudnn安装

    首先是安装ubuntu16.04 A.制作u盘启动盘(提前准备好.ios文件): 1.安装u盘制作工具unetbootinsudo apt-get install unetbootin2.格式化u盘s ...

  6. 微信小程序自制提示框(具有输入文本功能)

    https://blog.csdn.net/qq_41681675/article/details/81005561

  7. ELK填坑总结和优化过程

    做了几周的测试,踩了无数的坑,总结一下,全是干货,给大家分享~ 一.elk 实用知识点总结 1.编码转换问题(主要就是中文乱码) (1)input 中的codec => plain 转码 cod ...

  8. Python开发【第八篇】:socket网络编程

    服务端: import socket server = socket.socket() #绑定要监听的端口 server.bind(('localhost',6969)) #监听 server.lis ...

  9. [C++]字符串相关操作

    获取字符串长度 String str str.length(); //获取String类型字符串长度 str.size(); //STL获取容器中元素个数 Char* s strlen(s); //以 ...

  10. 651. 4 Keys Keyboard复制粘贴获得的最大长度

    [抄题]: Imagine you have a special keyboard with the following keys: Key 1: (A): Print one 'A' on scre ...