zoukankan      html  css  js  c++  java
  • [USACO18FEB] New Barns

    题意

    每次新建一个节点,并与一个已知节点连边。(或者不连)。多次询问以某个已知点点出发的最远路径长度。

    分析

    显然,在任何时候图都是一个森林。由树的直径算法可知,与某点最远距的点必然是树的直径的一段。那么考虑在lct中维护直径。

    实现

    一篇精彩的LCT,应该像少女穿的迷你裙,越短越好。——林语堂 (误

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    
    namespace lct {
    	int ch[N][2],fa[N],siz[N]; bool rev[N];
    	bool get(int x) {return ch[fa[x]][1]==x;}
    	bool nrt(int x) {return ch[fa[x]][0]==x||ch[fa[x]][1]==x;}
    	void update(int x) {siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;}
    	void pushdown(int x) {if(rev[x]) rev[ch[x][0]]^=1,rev[ch[x][1]]^=1,swap(ch[x][0],ch[x][1]),rev[x]=0;}
    	void rotate(int x) {
    		int y=fa[x],k=get(x); if(nrt(y)) ch[fa[y]][get(y)]=x;
    		fa[x]=fa[y]; fa[ch[x][k^1]=fa[ch[y][k]=ch[x][k^1]]=y]=x; update(y);
    	}
    	void clear(int x) {if(nrt(x)) clear(fa[x]); pushdown(x);}
    	void splay(int x) {
    		for(clear(x); nrt(x); rotate(x)) 
    			if(nrt(fa[x])) rotate(get(x)^get(fa[x])?x:fa[x]); 
    		update(x);
    	}
    	void access(int x) {for(int y=0; x; update(y=x),x=fa[x]) splay(x),ch[x][1]=y;}
    	void make(int x) {access(x); splay(x); rev[x]^=1;}
    	void split(int x,int y) {make(x); access(y); splay(y);}
    	void link(int x,int y) {split(x,y); fa[x]=y;}
    	int length(int x,int y) {split(x,y); return siz[y]-1;}
    }
    
    int q,x,tot,l[N],r[N],bel[N];
    char op[10];
    
    int main() {
    	scanf("%d",&q);
    	while(q--) {
    		scanf("%s%d",op,&x);
    		if(*op=='Q') {
    			printf("%d
    ",max(lct::length(x,l[bel[x]]),lct::length(x,r[bel[x]])));
    			continue;
    		}
    		lct::siz[++tot]=1;
    		if(x==-1) bel[tot]=tot,l[tot]=r[tot]=tot;
    		else {
    			lct::link(tot,x); bel[tot]=bel[x];
    			int ll=lct::length(tot,l[bel[x]]);
    			int lr=lct::length(tot,r[bel[x]]);
    			int ld=lct::length(l[bel[x]],r[bel[x]]);
    			if(ll>=lr&&ll>=ld) r[bel[x]]=tot;
    			else if(lr>=ll&&lr>=ld) l[bel[x]]=tot;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    IDL---ENVI
    IDL基础
    IDL_GUI
    .Net MVC+bootstrap Table学习
    .Net中的加密解密
    Linux服务器上安装织梦CMS
    数据仓储之DLL层接口设计
    js获取新浪天气接口
    js动态生成二维码图片
    Jquery点击发送按钮后,按钮文本倒计时
  • 原文地址:https://www.cnblogs.com/nosta/p/10526116.html
Copyright © 2011-2022 走看看