MLE求调(码风良好)
查看原帖
MLE求调(码风良好)
777319
乙轩楼主2025/7/25 19:46
#include <bits/stdc++.h>
using namespace std;
// typedef long long ll;
const int MAXN = 3e4 + 5;
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define mid ((l+r)>>1)

int n;
vector <int> G[MAXN];
int w[MAXN],top[MAXN],siz[MAXN],dep[MAXN],cnt,Hson[MAXN],id[MAXN],f[MAXN];
int s0[MAXN<<2],s1[MAXN<<2];

void dfs0(int u,int fa,int d){
    siz[u] = 1;
    dep[u] = d + 1;
    f[u] = fa;
    for (auto i : G[u]){
        if (i == fa)  continue;
        dfs0(i,u,d+1);
        siz[u] += siz[i];
        if (siz[Hson[u]] < siz[i]){
            Hson[u] = i;
        }
    }
}

void dfs1(int u,int tp){
    top[u] = tp;
    // dfn[u] = ++cnt;
    id[++cnt] = u;
    if (!Hson[u]) return ;
    dfs1(Hson[u],tp);
    for (auto i : G[u]){
        if (top[i] == tp) continue;
        if (i == Hson[u]) continue;
        dfs1(i,i);
    }
}

void push_up(int p){
    s0[p] = max(s0[ls(p)],s0[rs(p)]);
    s1[p] = s1[ls(p)] + s1[rs(p)];
}

void build(int p,int l,int r){
    if (l == r){
        s0[p] = w[id[l]];
        s1[p] = w[id[l]];
        return ;
    }
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}

void update(int p,int l,int r,int P,int x){
    if (l > P || r < P) return;
    if (l==r && l == P){
        s0[p] = x;
        s1[p] = x;
        return;
    }
    update(ls(p),l,mid,P,x);
    update(rs(p),mid+1,r,P,x);
    push_up(p);
}

int ask_max(int p,int l,int r,int L,int R){
    if (l > R || r < L) return -3000000;
    if (l >= L && r <= R){
        return s0[p];
    }
    return max(ask_max(ls(p),l,mid,L,R),ask_max(rs(p),mid+1,r,L,R));
}

int ask_sum(int p,int l,int r,int L,int R){
    if (l > R || r < L) return 0;
    if (l >= L && r <= R) return s1[p];
    return ask_sum(ls(p),l,mid,L,R)+ask_sum(rs(p),mid+1,r,L,R);
}

int query_max(int u,int v){
    int ret = -300000000;
    while(top[u] != top[v]){
        if (dep[top[u]] < dep[top[v]]) swap(u,v);
        ret = max(ret,ask_max(1,1,n,id[top[u]],id[u]));
        u = f[top[u]];
    }
    if (dep[u] < dep[v]) swap(u,v);
    ret = max(ret,ask_max(1,1,n,id[v],id[u]));
    return ret;
}

int query_sum(int u,int v){
    int ret = 0;
    while(top[u] != top[v]){
        if (dep[top[u]] < dep[top[v]]) swap(u,v);
        ret += ask_sum(1,1,n,id[top[u]],id[u]);
        u = f[top[u]];
    }
    if (dep[u] < dep[v]) swap(u,v);
    ret += ask_sum(1,1,n,id[v],id[u]);
    return ret;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    for (int i=1;i < n;i++){
        int u,v;
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for (int i=1;i <= n;i++){
        cin >> w[i];
    }
    dfs0(1,0,0);
    dfs1(1,1);
    build(1,1,n);
    int q;
    cin >> q;
    while (q--){
        string s;
        cin >> s;
        if (s == "CHANGE"){
            int u,t;
            cin >> u >> t;
            update(1,1,n,id[u],t);
        }
        else if (s == "QMAX"){
            int u,v;
            cin >> u >> v;
            cout << query_max(u,v) << endl;
        }
        else{
            int u,v;
            cin >> u >> v;
            cout << query_sum(u,v) << endl;
        }
    }
    return 0;
}

rt

2025/7/25 19:46
加载中...