求看
查看原帖
求看
600441
ZhongYuLin楼主2023/10/27 15:18

已知:在部分数据下,assert(l<=r)会抛出异常 提交记录(变量名算清晰了吧?)

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,INF=0x3f3f3f3f;
int head[N<<1],nex[N<<1],to[N<<1],val[N<<1];
int fa[N],son[N],top[N],sz[N],dp[N],id[N],wor[N],a[N];
int t_sum[N<<2],t_mx[N<<2],t_mn[N<<2];
bool change[N<<2];
int tot,n,cnt;
string op;
vector<pair<int,int>>e;
void add(int u,int v,int w){
    nex[++tot]=head[u];
    to[tot]=v;val[tot]=w;
    head[u]=tot;
}
void dfs1(int x,int f,int deep){
    dp[x]=deep;fa[x]=f;sz[x]=1;int mx=-1;
    for(int i=head[x];i;i=nex[i]){
        int y=to[i];
        if(y==f)continue;
        dfs1(y,x,deep+1);
        sz[x]+=sz[y];a[y]=val[i];
        sz[y]>mx&&(mx=sz[y],son[x]=y);
    }
}
void dfs2(int x,int topf){
    id[x]=++cnt;top[x]=topf;wor[cnt]=a[x];
    if(!son[x])return;
    dfs2(son[x],topf);
    for(int i=head[x];i;i=nex[i]){
        int y=to[i];
        if(y==son[x]||y==fa[x])continue;
        dfs2(y,y);
    }
}
static inline int ls(int p){return p<<1;}
static inline int rs(int p){return p<<1|1;}
void push_up(int p){
    t_sum[p]=t_sum[ls(p)]+t_sum[rs(p)];
    t_mx[p]=max(t_mx[ls(p)],t_mx[rs(p)]);
    t_mn[p]=min(t_mn[ls(p)],t_mn[rs(p)]);
}
void fix(int p){
    change[p]^=1;
    t_sum[p]=-t_sum[p];
    t_mn[p]=-t_mx[p];
    t_mx[p]=-t_mn[p];
}
void push_down(int p){
    if(change[p])fix(ls(p)),fix(rs(p)),change[p]=0;
}
void build(int l=1,int r=n,int p=1){
    if(l==r){t_sum[p]=t_mx[p]=t_mn[p]=wor[l];return;}
    int mid=l+r>>1;
    build(l,mid,ls(p));
    build(mid+1,r,rs(p));
    push_up(p);
}
void updCover(int x,int k,int l=1,int r=n,int p=1){
    if(l==r){t_sum[p]=t_mn[p]=t_mx[p]=k;return;}
    int mid=l+r>>1;push_down(p);
    if(x<=mid)updCover(x,k,l,mid,ls(p));
    else updCover(x,k,mid+1,r,rs(p));
    push_up(p);
}
void updChange(int x,int y,int l=1,int r=n,int p=1){
    assert(x<=y);
    if(x<=l&&r<=y){fix(p);return;}
    int mid=l+r>>1;push_down(p);
    if(x<=mid)updChange(x,y,l,mid,ls(p));
    if(y>mid)updChange(x,y,mid+1,r,rs(p));
    push_up(p);
}
int querySum(int x,int y,int l=1,int r=n,int p=1){
    assert(x<=y);
    if(x<=l&&r<=y)return t_sum[p];
    int mid=l+r>>1,ans=0;push_down(p);
    if(x<=mid)ans+=querySum(x,y,l,mid,ls(p));
    if(y>mid)ans+=querySum(x,y,mid+1,r,rs(p));
    return ans;
}
int queryMin(int x,int y,int l=1,int r=n,int p=1){
    assert(x<=y);
    if(x<=l&&r<=y)return t_mn[p];
    int mid=l+r>>1,ans=INF;push_down(p);
    if(x<=mid)ans=min(ans,queryMin(x,y,l,mid,ls(p)));
    if(y>mid)ans=min(ans,queryMin(x,y,mid+1,r,rs(p)));
    return ans;
}
int queryMax(int x,int y,int l=1,int r=n,int p=1){
    assert(x<=y);
    if(x<=l&&r<=y)return t_mx[p];
    int mid=l+r>>1,ans=-INF;push_down(p);
    if(x<=mid)ans=max(ans,queryMax(x,y,l,mid,ls(p)));
    if(y>mid)ans=max(ans,queryMax(x,y,mid+1,r,rs(p)));
    return ans;
}
void rangeChange(int x,int y){
    while(top[x]!=top[y]){
        if(dp[top[x]]<dp[top[y]])swap(x,y);
        updChange(id[top[x]],id[x]);
        x=fa[top[x]];
    }
    if(id[x]>id[y])swap(x,y);
    // return;
    // if(id[x]+1>id[y]){printf("%d %d\n",id[x]+1,id[y]);exit(0);}
    // if(id[x]+1>id[y])return;
    updChange(id[x]+1,id[y]);
}
int qSum(int x,int y){
    int ans=0;
    while(top[x]!=top[y]){
        if(dp[top[x]]<dp[top[y]])swap(x,y);
        // if(id[top[x]]>id[x]){printf("%d %d\n",id[top[x]],id[x]);exit(0);}
        ans+=querySum(id[top[x]],id[x]);
        x=fa[top[x]];
    }
    if(id[x]>id[y])swap(x,y);
    // return 1;
    // if(id[x]+1>id[y])return ans;
    return ans+=querySum(id[x]+1,id[y]);
}
int qMax(int x,int y){
    int ans=-INF;
    while(top[x]!=top[y]){
        if(dp[top[x]]<dp[top[y]])swap(x,y);
        ans=max(ans,queryMax(id[top[x]],id[x]));
        x=fa[top[x]];
    }
    if(id[x]>id[y])swap(x,y);
    // return 1;
    // if(id[x]+1>id[y])return ans;
    return max(ans,queryMax(id[x]+1,id[y]));
}
int qMin(int x,int y){
    int ans=INF;
    while(top[x]!=top[y]){
        if(dp[top[x]]<dp[top[y]])swap(x,y);
        ans=min(ans,queryMin(id[top[x]],id[x]));
        x=fa[top[x]];
    }
    if(id[x]>id[y])swap(x,y);
    // return 1;
    // if(id[x]+1>id[y])return ans;
    return min(ans,queryMin(id[x]+1,id[y]));
}
int main(){
    int i,j,k,u,v,w,m;
    memset(t_mn,0x3f,sizeof(t_mn));memset(t_mx,0xcf,sizeof(t_mx));
    // freopen("P1505.in","r",stdin);
    // freopen("P1505.out","w",stdout);
    ios::sync_with_stdio(0);cin.tie(0);
    for(cin>>n,i=1;i<n;i++)cin>>u>>v>>w,add(u+1,v+1,w),add(v+1,u+1,w),e.push_back({u+1,v+1});
    dfs1(1,0,1);dfs2(1,1);build();
    // for(int i=1;i<=n;i++)printf("%d ",id[i]);
    // puts("");
    for(cin>>m;m--;){
        cin>>op>>u>>v;
        if(op[0]=='C'){
            int x=e[u-1].first,y=e[u-1].second;
            if(dp[x]<dp[y])swap(x,y);
            // printf("%d %d\n",x,y);
            updCover(id[x],v);
        }else if(op[0]=='N'){
            rangeChange(u+1,v+1);
        }else if(op[0]=='S'){
            printf("%d\n",qSum(u+1,v+1));
        }else if(op[1]=='A'){
            printf("%d\n",qMax(u+1,v+1));
        }else{
            printf("%d\n",qMin(u+1,v+1));
        }
        // puts("OK");
    }
    return 0;
}
2023/10/27 15:18
加载中...