求助c++转c
查看原帖
求助c++转c
964089
run_away楼主2024/5/19 20:00

这题好像不能用c++

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((t[x].l+t[x].r)>>1)
inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}
const ll mod=1e9+7,maxn=3e5+5,maxt=505;
ll n,head[maxn],tot,fa[maxn],dep[maxn],siz[maxn],top[maxn],big[maxn],dfn[maxn],id[maxn],cnt,dis[maxn];
vector<ll>son[maxn];
struct edge{
    ll frm,to,nxt,val;
}e[maxn<<1];
inline void add(ll u,ll v,ll w){e[++tot]=(edge){u,v,head[u],w},head[u]=tot;}
struct node{
    ll l,r,mx;
}t[maxn<<2];
inline void pushup(ll x){
    t[x].mx=max(t[ls].mx,t[rs].mx);
}
inline void build(ll x,ll l,ll r){
    t[x].l=l,t[x].r=r;
    while(l==r){
        t[x].mx=dis[id[l]];
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(x);
}
inline void update(ll x,ll pos,ll k){
    if(t[x].l==t[x].r){
        t[x].mx=k;
        return;
    }
    if(pos<=mid)update(ls,pos,k);
    else update(rs,pos,k);
    pushup(x);
}
inline ll query(ll x,ll l,ll r){
    if(l<=t[x].l&&t[x].r<=r)return t[x].mx;
    ll ans=0;
    if(l<=mid)ans=max(ans,query(ls,l,r));
    if(r>mid)ans=max(ans,query(rs,l,r));
    return ans;
}
inline void dfs1(ll u,ll pre){
    dep[u]=dep[pre]+1,fa[u]=pre,siz[u]=1;
    for(ll i=head[u];i;i=e[i].nxt){
        ll v=e[i].to;
        if(v==pre)continue;
        dfs1(v,u);
        siz[u]+=siz[v];
        dis[v]=e[i].val;
        if(siz[v]>siz[big[u]])big[u]=v;
    }
}
inline void dfs2(ll u,ll pre){
    dfn[u]=++cnt,id[cnt]=u,top[u]=pre;
    if(big[u])dfs2(big[u],pre);
    for(ll i=head[u];i;i=e[i].nxt){
        ll v=e[i].to;
        if(v==fa[u]||v==big[u])continue;
        dfs2(v,v);
    }
}
inline ll ask(ll u,ll v){
    if(u==v)return 0;
    ll ans=0;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]])swap(u,v);
        ans=max(ans,query(1,dfn[top[u]],dfn[u]));
        u=fa[top[u]];
    }
    if(dep[u]>dep[v])swap(u,v);
    ans=max(ans,query(1,dfn[u]+1,dfn[v]));
    return ans;
}
inline void solve(){
    memset(head,0,sizeof(head));
    memset(t,0,sizeof(t));
    tot=0,cnt=0;
    n=read();
    for(ll i=1;i<n;++i){
        ll u=read(),v=read(),w=read();
        add(u,v,w),add(v,u,w);
    }
    dfs1(1,0),dfs2(1,1),build(1,1,n);
    string op;
    while(cin>>op&&op!="DONE"){
        if(op=="CHANGE"){
            ll x=read(),t=read();
            ll u=e[x*2-1].frm,v=e[x*2-1].to;
            if(fa[v]=u)u=v;
            update(1,dfn[u],t);
        }
        else{
            ll u=read(),v=read();
            printf("%lld\n",ask(u,v));
        }
    }
}
signed main(){
    ll t=read();
    while(t--)solve();
    return 0;
}
2024/5/19 20:00
加载中...