我真的找不出哪里还有错了 救救我
查看原帖
我真的找不出哪里还有错了 救救我
233127
千叶の黑猫楼主2020/8/15 11:19
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long 
#define ls k<<1
#define rs k<<1|1
const ll maxn =3e4+5;
struct node{
	int to,next;
}e[maxn*4];
int h[maxn],cnt,dad[maxn],dep[maxn],fson[maxn],hson[maxn],tp[maxn],id[maxn],num[maxn],z[maxn];
long long read(){
   long long ans=0;
    char last=' ',ch=getchar();
    while(ch<'0' || ch>'9')last=ch,ch=getchar();
    while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    if(last=='-')ans=-ans;
    return ans;
}
void add(int u,int v){
    e[++cnt].to=v;
    e[cnt].next=h[u];
    h[u]=cnt;
}
struct meanless{
    int l,r;
    ll ans,maxn;
}t[maxn*4];
void dfs(int k,int from){
    dad[k]=from;
    dep[k]=dep[from]+1;
    fson[k]=1;
    int maxx=0;
    for(int i=h[k];i;i=e[i].next){
        int v=e[i].to;
        if(v!=from) {
            dfs(v,k);
            fson[k]+=fson[v];
            if(fson[v]>maxx) {
                hson[k]=v;
                maxx=fson[v];
            }
        }
    }
}
void dfs1(int u,int top){
      tp[u]=top;
      id[u]=++cnt;
      num[cnt]=z[u];
      if(!hson[u]) return ;
      dfs1(hson[u],top);
      for(int i=h[u];i;i=e[i].next){
          int v=e[i].to;
          if(!id[v]) dfs1(v,v);
      }
}
void date(int k){
    t[k].maxn=max(t[ls].maxn,t[rs].maxn);
    t[k].ans=t[ls].ans+t[rs].ans;
    return ;
}
void build(int k,int l,int r){
  t[k].l=l;
  t[k].r=r;
  if(l==r){
   t[k].ans=num[l];
   t[k].maxn=num[l];
   return ;
  }
  int mid=l+r>>1;
  build(ls,l,mid);
  build(rs,mid+1,r);
  date(k);
}
void change(int k,int l,int val){
    if(t[k].l==l&&t[k].r==l) {
	t[k].ans=val;t[k].maxn=val;return ;}
    int mid=t[k].l+t[k].r>>1;
    if(mid>=l) change(ls,l,val);
    if(mid<l) change(rs,l,val);
    date(k);
}
ll qmax(int k,int l,int r){
    if(t[k].l>=l&&t[k].r<=r) return t[k].maxn;
    int mid=t[k].l+t[k].r>>1;
    ll temp=0;
    if(mid>=l) temp=max(qmax(ls,l,r),temp);
    if(mid<r)  temp=max(qmax(rs,l,r),temp);
    return temp;
}
ll qnum(int k,int l,int r){
    if(t[k].l>=l&&t[k].r<=r) return t[k].ans;
    int mid=t[k].l+t[k].r>>1;
    ll temp=0;
    if(mid>=l) temp+=qnum(ls,l,r);
    if(mid<r)  temp+=qnum(rs,l,r);
    return temp;
}
void treemax(int x,int y){
    ll temp=0;
    while(tp[x]!=tp[y]){
        if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
        temp=max(qmax(1,id[tp[x]],id[x]),temp);
        x=dad[tp[x]];
    }
   if(dep[x]<dep[y]) swap(x,y);
   temp=max(qmax(1,id[y],id[x]),temp);
   printf("%lld",temp);
}
void treenum(int x,int y){
    ll temp=0;
    while(tp[x]!=tp[y]){
        if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
        temp+=qnum(1,id[tp[x]],id[x]);
        x=dad[tp[x]];
    }
   if(dep[x]<dep[y]) swap(x,y);
   temp+=qnum(1,id[y],id[x]);
   printf("%lld",temp);
}
int main(){
	int n,a,b;cin>>n;
	for(int i=1;i<n;++i) {a=read();b=read();add(a,b);add(b,a);}
    dfs(1,0);
    cnt=0;
    for(int i=1;i<=n;++i)
    z[i]=read();
    dfs1(1,1);
    build(1,1,n);
    int m;cin>>m;
    string ai;
    int x,y;
    while(m--){
    cin>>ai;
    if(ai=="CHANGE"){
        x=read();y=read();
        change(1,id[x],y);
    }
    if(ai=="QMAX"){
        x=read();y=read();
        treemax(x,y);
    }
    if(ai=="QSUM"){
    	x=read();y=read();
    	treenum(x,y);
	}
  }
}
2020/8/15 11:19
加载中...