AC on #11 #12 20pts 求调
查看原帖
AC on #11 #12 20pts 求调
784856
Comars楼主2023/8/24 12:37

rt.

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int fa[200005],dep[200005],dfn[200005],rnk[200005],top[200005],sz[200005],hson[200005],cnt;
int h[200005],n,m,u,v,w,a[200005],tot,x,y,tot_;
int tsum[800005],tmax[800005],tmin[800005],lazy[800005];
string op;
struct edge{
    int v,c,next;
}e[400005];
struct node{
    int u,v;
}idx[200005];
void addedge(int u,int v,int c){
    e[++tot]=edge{v,c,h[u]};
    h[u]=tot;
}
void dfs1(int u,int f){
    fa[u]=f;
    sz[u]=1;
    hson[u]=-1;
    for(int i=h[u];i;i=e[i].next)
    	if(e[i].v!=f){
	        dep[e[i].v]=dep[u]+1;
	        dfs1(e[i].v,u);
	        sz[u]+=sz[e[i].v];
	        if(hson[u]==-1||sz[e[i].v]>sz[hson[u]]) hson[u]=e[i].v;
	    }
}
void dfs2(int u,int t){
    dfn[u]=++cnt;
    rnk[cnt]=u;
    top[u]=t;
    if(hson[u]==-1) return;
    for(int i=h[u];i;i=e[i].next){
    	if(e[i].v==fa[u]) continue;
        a[e[i].v]=e[i].c;
        if(e[i].v==hson[u]) dfs2(e[i].v,t);
        else dfs2(e[i].v,e[i].v);
    }
}
void build(int node,int l,int r){
    if(l==r){
        tsum[node]=tmax[node]=tmin[node]=a[rnk[l]];
        return;
    }
    int mid=(l+r)>>1;
    build(node<<1,l,mid);
    build(node<<1|1,mid+1,r);
    tsum[node]=tsum[node<<1]+tsum[node<<1|1];
    tmax[node]=max(tmax[node<<1],tmax[node<<1|1]);
    tmin[node]=min(tmin[node<<1],tmin[node<<1|1]);
}
void pushdown(int node){
    if(lazy[node]){
        tsum[node<<1]=-tsum[node<<1];
        tsum[node<<1|1]=-tsum[node<<1|1];
        tmax[node<<1]=-tmax[node<<1];
        tmax[node<<1|1]=-tmax[node<<1|1];
        tmin[node<<1]=-tmin[node<<1];
        tmin[node<<1|1]=-tmin[node<<1|1];
        swap(tmin[node<<1],tmax[node<<1]);
        swap(tmin[node<<1|1],tmax[node<<1|1]);
        lazy[node<<1]=lazy[node<<1]^1;
        lazy[node<<1|1]=lazy[node<<1|1]^1;
        lazy[node]=0;
    }
}
void removeopp(int node,int l,int r,int start,int end){
	if(start<=l&&r<=end){
        lazy[node]=lazy[node]^1;
        tsum[node]=-tsum[node];
        tmax[node]=-tmax[node];
        tmin[node]=-tmin[node];
        swap(tmax[node],tmin[node]);
        return;
    }
    if(start>r||l>end) return;
    pushdown(node);
    int mid=(l+r)>>1;
    removeopp(node<<1,l,mid,start,end);
    removeopp(node<<1|1,mid+1,r,start,end);
    tsum[node]=tsum[node<<1]+tsum[node<<1|1];
    tmax[node]=max(tmax[node<<1],tmax[node<<1|1]);
    tmin[node]=min(tmin[node<<1],tmin[node<<1|1]);
}
void change(int node,int l,int r,int id,int d){
    if(l==r&&l==id){
        tsum[node]=tmax[node]=tmin[node]=d;
        lazy[node]=0;
        return;
    }
    pushdown(node);
    int mid=(l+r)>>1;
    if(id<=mid) change(node<<1,l,mid,id,d);
    if(mid<id) change(node<<1|1,mid+1,r,id,d);
    tsum[node]=tsum[node<<1]+tsum[node<<1|1];
    tmax[node]=max(tmax[node<<1],tmax[node<<1|1]);
    tmin[node]=min(tmin[node<<1],tmin[node<<1|1]);
}
int querysum(int node,int l,int r,int start,int end){
    if(l>=start&&r<=end) return tsum[node];
    if(r<start||l>end) return 0;
    int mid=(l+r)>>1;
    pushdown(node);
    return querysum(node<<1,l,mid,start,end)+querysum(node<<1|1,mid+1,r,start,end);
}
int querymax(int node,int l,int r,int start,int end){
    if(l>=start&&r<=end) return tmax[node];
    if(r<start||l>end) return -0x3f3f3f3f;
    pushdown(node);
    int mid=(l+r)>>1;
    return max(querymax(node<<1,l,mid,start,end),querymax(node<<1|1,mid+1,r,start,end));
}
int querymin(int node,int l,int r,int start,int end){
    if(l>=start&&r<=end) return tmin[node];
    if(r<start||l>end) return 0x3f3f3f3f;
    pushdown(node);
    int mid=(l+r)>>1;
    return min(querymin(node<<1,l,mid,start,end),querymin(node<<1|1,mid+1,r,start,end));
}
void updij(int u,int v){
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        removeopp(1,1,n,dfn[top[u]],dfn[u]);
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    if(u!=v) removeopp(1,1,n,dfn[u]+1,dfn[v]);
}
int qudijsum(int u,int v){
    int ans=0;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        ans+=querysum(1,1,n,dfn[top[u]],dfn[u]);
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    if(u!=v) ans+=querysum(1,1,n,dfn[u]+1,dfn[v]);
    return ans;
}
int qudijmax(int u,int v){
    int ans=-0x3f3f3f3f;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        ans=max(ans,querymax(1,1,n,dfn[top[u]],dfn[u]));
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    if(u!=v) ans=max(ans,querymax(1,1,n,dfn[u]+1,dfn[v]));
    return ans;
}
int qudijmin(int u,int v){
    int ans=0x3f3f3f3f;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        ans=min(ans,querymin(1,1,n,dfn[top[u]],dfn[u]));
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    if(u!=v) ans=min(ans,querymin(1,1,n,dfn[u]+1,dfn[v]));
    return ans;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&u,&v,&w);
        addedge(u+1,v+1,w),addedge(v+1,u+1,w);
        idx[++tot_]=node{u+1,v+1};
    }
    scanf("%d",&m);
    dfs1(1,0);
    dfs2(1,1);
    build(1,1,n);
    while(m--){
        cin>>op;
        if(op=="C"){
            scanf("%d%d",&x,&y);
            int tmp;
            if(dep[idx[x].u]<dep[idx[x].v]) tmp=idx[x].v;
            else tmp=idx[x].u;
            change(1,1,n,dfn[tmp],y);
        }else if(op=="N"){
            scanf("%d%d",&x,&y);
            updij(x+1,y+1);
        }else if(op=="SUM"){
            scanf("%d%d",&x,&y);
            printf("%d\n",qudijsum(x+1,y+1));
        }else if(op=="MAX"){
            scanf("%d%d",&x,&y);
            printf("%d\n",qudijmax(x+1,y+1));
        }else{
            scanf("%d%d",&x,&y);
            printf("%d\n",qudijmin(x+1,y+1));
        }
    }
    return 0;
}
2023/8/24 12:37
加载中...