BZOJ 4538: [Hnoi2016]网络

来源:互联网 发布:爱思助手有没有mac版 编辑:程序博客网 时间:2024/05/18 00:05

感觉考试的时候智商约等于0 QAQ

直接把链剖出来的区间取反再更新就好了

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N=200000+5;#define rep(i,l,r) for(int i=l;i<=r;i++)typedef priority_queue<int> heap;struct Twoheap{heap h,d;void push(int x){h.push(x);}void del(int x){d.push(x);}int top(){while(!d.empty()&&d.top()==h.top())d.pop(),h.pop();return h.top();}};struct Edge{int to,next;}e[N<<1];int head[N],cnt;void ins(int u,int v){e[++cnt]=(Edge){v,head[u]};head[u]=cnt;}void insert(int u,int v){ins(u,v);ins(v,u);}struct Node{int l,r;Twoheap h;}tr[N<<2];#define lc o<<1#define rc o<<1|1void update(int o,int a,int b,int v,bool flag){int l=tr[o].l,r=tr[o].r;if(a<=l&&r<=b)flag?tr[o].h.push(v):tr[o].h.del(v);else{int mid=l+r>>1;if(a<=mid)update(lc,a,b,v,flag);if(mid<b)update(rc,a,b,v,flag);}}int query(int o,int p){int l=tr[o].l,r=tr[o].r;if(l==r)return tr[o].h.top();else{int mid=l+r>>1;if(p<=mid)return max(query(lc,p),tr[o].h.top());else return max(query(rc,p),tr[o].h.top());}}void build(int o,int l,int r){tr[o].l=l;tr[o].r=r;tr[o].h.push(-1);if(l==r)return;int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r);}int fa[N],son[N],siz[N],dep[N],top[N],pos[N],sz;void dfs(int u){siz[u]=1;for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(v==fa[u])continue;fa[v]=u;dep[v]=dep[u]+1;dfs(v);siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;}}void dfs(int u,int tp){pos[u]=++sz;top[u]=tp;if(son[u])dfs(son[u],tp);for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(v!=son[u]&&v!=fa[u])dfs(v,v);}}struct chain_interval{int l,r;bool operator<(const chain_interval &x)const{return l<x.l;}}ch[N];int tot;void add_chain(int l,int r){ch[++tot]=(chain_interval){l,r};}void depart(int u,int v){tot=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);add_chain(pos[top[u]],pos[u]);u=fa[top[u]];}if(dep[u]>dep[v])swap(u,v);add_chain(pos[u],pos[v]);}void update(int u,int v,int w,bool flag){depart(u,v);sort(ch+1,ch+1+tot);if(ch[1].l!=1)update(1,1,ch[1].l-1,w,flag);rep(i,2,tot)update(1,ch[i-1].r+1,ch[i].l-1,w,flag);if(ch[tot].r!=sz)update(1,ch[tot].r+1,sz,w,flag);}int w[N],x[N],y[N];int read(){char ch=getchar();int x=0,f=1;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}int main(){//freopen("a.in","r",stdin);int n,m;n=read();m=read();rep(i,2,n){int u,v;u=read();v=read();insert(u,v);}dfs(1);dfs(1,1);build(1,1,sz);rep(i,1,m){int k=read();if(k==0){x[i]=read();y[i]=read();w[i]=read();update(x[i],y[i],w[i],1);}else if(k==1){k=read();update(x[k],y[k],w[k],0);}else{k=read();printf("%d\n",query(1,pos[k]));}}return 0;}


0 0