8pts求条
查看原帖
8pts求条
713335
taojinchen楼主2023/11/4 20:04

代码略显丑陋,daolao不喜勿喷

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int kM=2e5+5;
ll sl,sr,d,i,n,x,y,z,p,q,root,cnt,num,t[kM],f[kM],id[kM],top[kM],sz[kM],dis[kM],ne[kM<<1],to[kM<<1],ed[kM];
string o;
struct T{
  ll sum,ma,mi,laz;
}tr[kM<<3];
bool h[kM];
void add(){
  ne[++cnt]=ed[x],to[cnt]=y,ed[x]=cnt;
  swap(x,y);
  if(cnt&1)add();
  return;
}
void dfs1(ll rt,ll fa){
  ll i,ans=0;
  f[rt]=fa,sz[rt]=1,dis[rt]=dis[fa]+1;
  for(i=ed[rt];i;i=ne[i]){
    if(fa!=to[i]){
      dfs1(to[i],rt);
      sz[rt]+=sz[to[i]];
      if(sz[to[i]]>sz[ans])ans=to[i];
    }
  }
  h[ans]=1;
  return;
}
void dfs2(ll rt,ll fa){
  ll i;
  id[rt]=++num;
  if(!h[rt])top[rt]=rt;
  else top[rt]=top[fa];
  for(i=ed[rt];i;i=ne[i]){
    if(fa!=to[i]&&h[to[i]]){
      dfs2(to[i],rt);
    }
  }
  for(i=ed[rt];i;i=ne[i]){
    if(fa!=to[i]&&!h[to[i]]){
      dfs2(to[i],rt);
    }
  }
  return;
}
void laz_tag(ll rt,ll l,ll r,ll mid){
  swap(tr[rt<<1].ma,tr[rt<<1].mi);
  tr[rt<<1].sum*=-1,tr[rt<<1].ma*=-1,tr[rt<<1].mi*=-1;
  tr[rt<<1].laz^=1;
  swap(tr[rt<<1|1].ma,tr[rt<<1|1].mi);
  tr[rt<<1|1].sum*=-1,tr[rt<<1|1].ma*=-1,tr[rt<<1|1].mi*=-1;
  tr[rt<<1|1].laz^=1;
  tr[rt].laz=0;
  return;
}
void update(ll rt,ll l,ll r){
  ll mid=(l+r)>>1;
  if(tr[rt].laz)laz_tag(rt,l,r,mid);
  if(sl<=l&&r<=sr){
    tr[rt].sum=tr[rt].ma=tr[rt].mi=d;
    return;
  }
  if(sl<=mid)update(rt<<1,l,mid);
  if(mid<sr)update(rt<<1|1,mid+1,r);
  tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
  tr[rt].ma=max(tr[rt<<1].ma,tr[rt<<1|1].ma);
  tr[rt].mi=min(tr[rt<<1].mi,tr[rt<<1|1].mi);
  return;
}
void sd(ll rt,ll l,ll r){
  ll mid=(l+r)>>1;
  if(tr[rt].laz)laz_tag(rt,l,r,mid);
  if(sl<=l&&r<=sr){
    swap(tr[rt].ma,tr[rt].mi);
    tr[rt].sum*=-1,tr[rt].ma*=-1,tr[rt].mi*=-1;
    tr[rt].laz^=1;
    return;
  }
  if(sl<=mid)sd(rt<<1,l,mid);
  if(mid<sr)sd(rt<<1|1,mid+1,r);
  tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
  tr[rt].ma=max(tr[rt<<1].ma,tr[rt<<1|1].ma);
  tr[rt].mi=min(tr[rt<<1].mi,tr[rt<<1|1].mi);
  return;
}
ll push_down(ll rt,ll l,ll r){
  ll mid=(l+r)>>1,ret=0;
  if(tr[rt].laz)laz_tag(rt,l,r,mid);
  if(o=="SUM"){
    if(sl<=l&&r<=sr){
      return tr[rt].sum;
    }
    if(sl<=mid)ret+=push_down(rt<<1,l,mid);
    if(mid<sr)ret+=push_down(rt<<1|1,mid+1,r);
  }
  else if(o=="MAX"){
    ret=-1e18;
    if(sl<=l&&r<=sr){
      return tr[rt].ma;
    }
    if(sl<=mid)ret=max(ret,push_down(rt<<1,l,mid));
    if(mid<sr)ret=max(ret,push_down(rt<<1|1,mid+1,r));
  }
  else{
    ret=1e18;
    if(sl<=l&&r<=sr){
      return tr[rt].ma;
    }
    if(sl<=mid)ret=min(ret,push_down(rt<<1,l,mid));
    if(mid<sr)ret=min(ret,push_down(rt<<1|1,mid+1,r));
  }
  tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
  tr[rt].ma=max(tr[rt<<1].ma,tr[rt<<1|1].ma);
  tr[rt].mi=min(tr[rt<<1].mi,tr[rt<<1|1].mi);
  return ret;
}
void lca_u(ll x,ll y){
  while(top[x]!=top[y]){
    if(dis[top[x]]<dis[top[y]])swap(x,y);
    sl=id[top[x]],sr=id[x];
    sd(1,1,n);
    x=f[top[x]];
  }
  if(x==y)return;
  if(dis[x]>dis[y])swap(x,y);
  sl=id[x]+1,sr=id[y];
  sd(1,1,n);
  return;
}
ll lca_p(ll x,ll y){
  ll ans=0; 
  if(o=="MAX")ans=-1e18;
  if(o=="MIN")ans=1e18;
  while(top[x]!=top[y]){
    if(dis[top[x]]<dis[top[y]])swap(x,y);
    sl=id[top[x]],sr=id[x];
    if(o=="SUM")ans+=push_down(1,1,n);
    else if(o=="MIN")ans=min(ans,push_down(1,1,n));
    else ans=max(ans,push_down(1,1,n));
    x=f[top[x]];
  }
  if(x==y)return ans;
  if(dis[x]>dis[y])swap(x,y);
  sl=id[x]+1,sr=id[y];
  if(o=="SUM")ans+=push_down(1,1,n);
  else if(o=="MIN")ans=min(ans,push_down(1,1,n));
  else ans=max(ans,push_down(1,1,n));
  return ans;
}
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  cin>>n;
  for(i=1;i<n;i++){
    cin>>x>>y>>t[i];
    x++,y++;
    add();
  }
  dfs1(1,0);
  dfs2(1,0);
  for(i=1;i<n;i++){
    d=t[i];
    sl=sr=dis[to[(i<<1)-1]]>dis[to[i<<1]]?id[to[(i<<1)-1]]:id[to[(i<<1)]];
    update(1,1,n);
  }
  cin>>q;
  while(q--){
    cin>>o;
    if(o=="C"){
      cin>>x>>d;
      sl=sr=dis[to[(x<<1)-1]]>dis[to[x<<1]]?id[to[(x<<1)-1]]:id[to[(x<<1)]];
      update(1,1,n);
    }
    else if(o=="N"){
      cin>>x>>y;
      x++,y++;
      lca_u(x,y);
    }
    else{
      cin>>x>>y;
      x++,y++;
      cout<<lca_p(x,y)<<"\n";
    }
  }
  return 0;
}
2023/11/4 20:04
加载中...