刚学OI 求调
查看原帖
刚学OI 求调
622631
u_lcp楼主2024/4/12 13:28
#include <bits/stdc++.h>
#define pc putchar(' ')
#define pe putchar('\n')
using namespace std;
template<typename T>void read(T& n)
{
    T f=1,k=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-'){f=-1;}c=getchar();}
    while(c<='9'&&c>='0'){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
    n=f*k;
}
template<typename T>void write(T x)
{
    if(x==0){putchar('0');return;}
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
const int maxn=3*1e4+10;
int siz[maxn],wc[maxn],top[maxn],fa[maxn],dep[maxn],tot,dfn[maxn],rdfn[maxn];
vector<int> e[maxn];
int n,q,a[maxn];
char tmp[10];
void dfs1(int u,int f)
{
    dep[u]=dep[f]+1,fa[u]=f,siz[u]=1;
    for(int v:e[u])
    {
        if(v==f)continue;
        dfs1(v,u);
        siz[u]+=siz[v];
        wc[u]=(siz[v]>siz[wc[u]]?v:wc[u]);
    }
}
void dfs2(int u,int t)
{
    top[u]=t,dfn[u]=++tot,rdfn[u]=tot;
    if(wc[u])dfs2(wc[u],t);
    for(int v:e[u])
    {
        if(v==fa[u]||v==wc[u])continue;
        dfs2(v,v);
    }
}
#define ls rt<<1
#define rs rt<<1|1
#define mid ((l+r)>>1)
struct sgt
{
    int l,r,maxx,sum;
}t[maxn<<2];
void pushup(int rt)
{
    t[rt].maxx=max(t[ls].maxx,t[rs].maxx);
    t[rt].sum=t[ls].sum+t[rs].sum;
}
void build(int rt,int l,int r)
{
    t[rt].l=l,t[rt].r=r;
    if(l==r)                                                                  
    {
        t[rt].maxx=t[rt].sum=a[rdfn[l]];
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(rt);
}
void update(int rt,int idx,int x)
{
    int l=t[rt].l,r=t[rt].r;
    if(l==r)
    {
        t[rt].maxx=t[rt].sum=x;
        return;
    }
    if(idx<=mid)update(ls,idx,x);
    else        update(rs,idx,x);
    pushup(rt);
}
int quemax(int rt,int ql,int qr)
{
    int l=t[rt].l,r=t[rt].r,ans=INT_MIN;
    if(ql<=l&&r<=qr)return t[rt].maxx;
    if(ql<=mid)ans=max(ans,quemax(ls,ql,qr));
    if(qr>mid) ans=max(ans,quemax(rs,ql,qr));
    return ans;
}
int quesum(int rt,int ql,int qr)
{
    int l=t[rt].l,r=t[rt].r,ans=0;
    if(ql<=l&&r<=qr)return t[rt].sum;
    if(ql<=mid)ans+=quesum(ls,ql,qr);
    if(qr>mid) ans+=quesum(rs,ql,qr);
    return ans;
}
int qmax(int x,int y)
{
    int ans=INT_MIN;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ans=max(ans,quemax(1,dfn[top[x]],dfn[x]));
        x=fa[top[x]];
    }
    ans=max(ans,quemax(1,min(dfn[x],dfn[y]),max(dfn[x],dfn[y])));
    return ans;
}
int qsum(int x,int y)
{
    int ans=0;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ans=ans+quesum(1,dfn[top[x]],dfn[x]);
        x=fa[top[x]];
    }
    ans=ans+quesum(1,min(dfn[x],dfn[y]),max(dfn[x],dfn[y]));
    return ans;
}

int main()
{
    read(n);
    for(int i=1,u,v;i<n;i++)
    {
        read(u),read(v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i=1;i<=n;i++)read(a[i]);
    dfs1(1,0);
    dfs2(1,1);
    build(1,1,n);
    read(q);
    for(int i=1,u,v;i<=q;i++)
    {
        scanf("%s",tmp),read(u),read(v);
        if(tmp[1]=='H')update(1,dfn[u],v);
        else if(tmp[1]=='M')write(qmax(u,v)),pe;
        else write(qsum(u,v)),pe;
    }
    return 0;
}
2024/4/12 13:28
加载中...