88pts #12TLE代码求调
查看原帖
88pts #12TLE代码求调
557892
n___j__z____楼主2023/11/17 22:54
#include <bits/stdc++.h>
#define ls(a) a<<1
#define rs(a) a<<1|1
using namespace std;
const int N=2e5+3,inf=1e9;
vector<int>v[N];
struct node{
	int x,mn,mx,lzy;
}sum[N<<2]; 
int n,siz[N],dfn[N],_,top[N],cnt=-1,f[N],s[N],x[N],y[N],w[N],deep[N],a[N];
string str;
void dfs1(int u,int fa){
    f[u]=fa,siz[u]=1;
    for(int i:v[u]) if(i!=fa){
		deep[i]=deep[u]+1;
        dfs1(i,u);
        siz[u]+=siz[i];
    }
}
void dfs(int u){
    if(top[u]==-1) top[u]=u;
    dfn[u]=++cnt;
    int op=-1;
    for(int i:v[u]) if(i!=f[u])
        if(op==-1||siz[i]>siz[op]) op=i;
    if(op!=-1){
        top[op]=top[u];
        dfs(op);
    }
    for(int i:v[u])
        if(i!=f[u]&&i!=op) dfs(i);
}
void up(int rt){
    int l=ls(rt),r=rs(rt);
    sum[rt].x=sum[l].x+sum[r].x,
	sum[rt].mx=max(sum[l].mx,sum[r].mx),
	sum[rt].mn=min(sum[l].mn,sum[r].mn);
}
void pd(int rt){
	if(sum[rt].lzy){
		int l=ls(rt),r=rs(rt);
		sum[rt].lzy=0;
		sum[l]=node{-sum[l].x,-sum[l].mx,-sum[l].mn,sum[l].lzy^1},
		sum[r]=node{-sum[r].x,-sum[r].mx,-sum[r].mn,sum[r].lzy^1};
	}
}
void build(int rt,int l,int r){
	if(l==r){sum[rt]=node{a[l],a[l],a[l],0};return;}
	int mid=(l+r)>>1;
	build(ls(rt),l,mid);build(rs(rt),mid+1,r);
	up(rt);
}
void change(int rt,int l,int r,int k,int v){
    if(l==r){sum[rt]=node{v,v,v,0};return;}
    int mid=(l+r)>>1;
    pd(rt);
    if(k<=mid) change(ls(rt),l,mid,k,v);
    else change(rs(rt),mid+1,r,k,v);
    up(rt);
}
void changeot(int x,int v){
    change(1,1,n,dfn[s[x]],v);
}
void change1(int rt,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr){
		sum[rt]=node{-sum[rt].x,-sum[rt].mx,-sum[rt].mn,sum[rt].lzy^1};
        return;
	}
    pd(rt);
    int mid=(l+r)>>1;
    if(ql<=mid) change1(ls(rt),l,mid,ql,qr);
    if(mid<qr) change1(rs(rt),mid+1,r,ql,qr);
    up(rt);
}
void Not(int u,int v){
    while(top[u]!=top[v]){
        if(deep[top[u]]<deep[top[v]]) swap(u,v);
        change1(1,1,n,dfn[top[u]],dfn[u]);
        u=f[top[u]];
    }
    if(deep[u]<deep[v]) swap(u,v);
    if(u!=v) change1(1,1,n,dfn[v]+1,dfn[u]);
}
int qsum(int rt,int l,int r,int ql,int qr){
	if(l==r) return sum[rt].x;
	pd(rt);
	int mid=(l+r)>>1,cnt=0;
	if(ql<=mid) cnt=qsum(ls(rt),l,mid,ql,qr);
	if(mid<qr) cnt+=qsum(rs(rt),mid+1,r,ql,qr);
	up(rt);
	return cnt;
}
int qsumot(int u,int v){
	int cnt=0;
	while(top[u]!=top[v]){
		if(deep[top[u]]<deep[top[v]]) swap(u,v);
		cnt+=qsum(1,1,n,dfn[top[u]],dfn[u]);
		u=f[top[u]];
	}
	if(deep[u]<deep[v]) swap(u,v);
	if(u!=v) cnt+=qsum(1,1,n,dfn[v]+1,dfn[u]);
	return cnt;
}
int qmn(int rt,int l,int r,int ql,int qr){
	if(l==r) return sum[rt].mn;
	pd(rt);
	int mid=(l+r)>>1,cnt=inf;
	if(ql<=mid) cnt=qmn(ls(rt),l,mid,ql,qr);
	if(mid<qr) cnt=min(cnt,qmn(rs(rt),mid+1,r,ql,qr));
	up(rt);
	return cnt;
}
int qmnot(int u,int v){
	int cnt=inf;
	while(top[u]!=top[v]){
		if(deep[top[u]]<deep[top[v]]) swap(u,v);
		cnt=min(cnt,qmn(1,1,n,dfn[top[u]],dfn[u]));
		u=f[top[u]];
	}
	if(deep[u]<deep[v]) swap(u,v);
	if(u!=v) cnt=min(cnt,qmn(1,1,n,dfn[v]+1,dfn[u]));
	return cnt;
}
int qmx(int rt,int l,int r,int ql,int qr){
	if(l==r) return sum[rt].mx;
	pd(rt);
	int mid=(l+r)>>1,cnt=-inf;
	if(ql<=mid) cnt=qmx(ls(rt),l,mid,ql,qr);
	if(mid<qr) cnt=max(cnt,qmx(rs(rt),mid+1,r,ql,qr));
	up(rt);
	return cnt;
}
int qmxot(int u,int v){
	int cnt=-inf;
	while(top[u]!=top[v]){
		if(deep[top[u]]<deep[top[v]]) swap(u,v);
		cnt=max(cnt,qmx(1,1,n,dfn[top[u]],dfn[u]));
		u=f[top[u]];
	}
	if(deep[u]<deep[v]) swap(u,v);
	if(u!=v) cnt=max(cnt,qmx(1,1,n,dfn[v]+1,dfn[u]));
	return cnt;
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;deep[0]=1,n--;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i]>>w[i];
        v[x[i]].push_back(y[i]);
        v[y[i]].push_back(x[i]);
    }
    for(int i=0;i<=n;i++) top[i]=-1;
    dfs1(0,-1);
    dfs(0);
    for(int i=1;i<=n;i++)
    	a[dfn[s[i]=(deep[x[i]]==deep[y[i]]+1?x[i]:y[i])]]=w[i];
	build(1,1,n);
	int u,v;
	cin>>_;
	while(_--){
		cin>>str>>u>>v;
		if(str=="C") changeot(u,v);
		if(str=="N") Not(u,v);
		if(str=="SUM") cout<<qsumot(u,v)<<"\n";
		if(str=="MAX") cout<<qmxot(u,v)<<"\n";
		if(str=="MIN") cout<<qmnot(u,v)<<"\n";
	}
    return 0;    
}
2023/11/17 22:54
加载中...