zoukankan      html  css  js  c++  java
  • BZOJ3082: Graph2

    LCT维护边被删除的时间的最大生成树,删边时若不在MST上则无视。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=250005;
    int n,m,q,l1;
    struct edge{int u,v,t;}c[N];
    struct info{char c;int u,v;}f[N];
    struct vec{
    	int u,v;
    	vec(int u=1e9,int v=0):u(u),v(v){}
    };
    bool operator<(vec a,vec b){
    	return a.u<b.u;
    }
    struct node;
    typedef node*ptr;
    struct node{
    	ptr i,j,p;
    	bool r;
    	vec v,s;
    	node();
    	ptr up(){
    		s=min(min(v,i->s),j->s);
    		return this;
    	}
    	void down(){
    		if(r)
    			i->r^=1,j->r^=1,swap(i,j),r=0;
    	}
    }e[N];
    node::node(){i=j=p=e;}
    bool root(ptr o){return o!=o->p->i&&o!=o->p->j;}
    void turn(ptr o){
    	ptr s=o->p,t=s->p;
    	if(!root(s))(s==t->i?t->i:t->j)=o;
    	s->p=o,o->p=t;
    	if(o==s->i)
    		s->i=o->j,o->j->p=s,o->j=s->up();
    	else
    		s->j=o->i,o->i->p=s,o->i=s->up();
    }
    void push(ptr o){
    	if(!root(o))push(o->p);
    	o->down();
    }
    ptr splay(ptr o){
    	push(o);
    	while(!root(o)){
    		if(!root(o->p))turn(o==o->p->i^o->p==o->p->p->i?o:o->p);
    		turn(o);
    	}
    	return o->up();
    }
    ptr exp(ptr o){
    	ptr s=e;
    	while(o!=e)splay(o)->j=s,s=o->up(),o=o->p;
    	return s;
    }
    void link(int i,int j){
    	exp(e+i)->r=1,splay(e+i)->p=e+j;
    }
    void cut(int i,int j){
    	ptr s=e+i,t=e+j;
    	exp(s)->r=1,exp(t);
    	if(s==t->i&&s->j==e)t->i=s->p=e;
    	if(t==s->j&&t->i==e)s->j=t->p=e;
    }
    bool jud(int i,int j){
    	exp(e+i)->r=1;
    	ptr o=exp(e+j);
    	while(o->i!=e)o=o->i,o->down();
    	return splay(o)==e+i;
    }
    void ins(int i){
    	if(c[i].u==c[i].v)return;
    	int&v=c[i].t;
    	if(!v)v=q+1;
    	e[n+i].v=vec(v,i);
    	if(!jud(c[i].u,c[i].v)){
    		link(c[i].u,n+i);
    		link(c[i].v,n+i);
    	}else{
    		int j=e[c[i].u].s.v;
    		if(c[i].t>c[j].t){
    			cut(c[j].u,n+j);
    			cut(c[j].v,n+j);
    			link(c[i].u,n+i);
    			link(c[i].v,n+i);
    		}
    	}
    }
    void del(int i){
    	cut(c[i].u,n+i);
    	cut(c[i].v,n+i);
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	l1=m;
    	for(int i=1;i<=m;++i)
    		scanf("%d%d",&c[i].u,&c[i].v);
    	scanf("%d",&q);
    	for(int i=1;i<=q;++i){
    		scanf(" %c%d",&f[i].c,&f[i].u);
    		if(f[i].c=='D'){
    			int&v=c[f[i].u].t;
    			if(!v)v=i;
    		}else{
    			scanf("%d",&f[i].v);
    			if(f[i].c=='I')
    				c[++l1]=(edge){f[i].u,f[i].v};
    		}
    	}
    	for(int i=1;i<=m;++i)
    		ins(i);
    	l1=m;
    	for(int i=1;i<=q;++i){
    		if(f[i].c=='D')del(f[i].u);
    		if(f[i].c=='I')ins(++l1);
    		if(f[i].c=='Q')
    			puts(jud(f[i].u,f[i].v)?"Yes":"No");
    	}
    }
    
  • 相关阅读:
    Ping
    boost::python开发环境搭建
    mingw和libcurl
    ssh远程执行命令使用明文密码
    netty源码阅读之UnpooledByteBufAllocator
    Direct ByteBuffer学习
    clions的使用
    netty中的PlatformDependent
    STL之priority_queue(优先队列)
    c++线程调用python
  • 原文地址:https://www.cnblogs.com/f321dd/p/5813830.html
Copyright © 2011-2022 走看看