过样例但全WA,求调
查看原帖
过样例但全WA,求调
947142
doujiamu楼主2024/9/28 09:37

rt,样例过了但是全WA

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll

const int maxn =3e4 + 7;
const int inf = -3e6 - 7;
vector<int> G[maxn];
int a[maxn], top[maxn], sz[maxn], wc[maxn], dep[maxn], fa[maxn], dfn[maxn], rdfn[maxn];
int w[maxn*4], lzy[maxn*4], w2[maxn*4];
int n, q, vistime;

void dfs1(int u, int f){
    sz[u] = 1;
    dep[u] = dep[f] + 1;
    fa[u] = f;
    for(int i = 0; i < G[u].size(); ++i) if(G[u][i] != f){
        int v = G[u][i];
        dfs1(v, u);
        sz[u] += sz[v];
        if(sz[v] > sz[wc[u]]) wc[u] = v;
    }
}

void dfs2(int u, int Top){
    dfn[u] = ++vistime;
    rdfn[vistime] = u;
    top[u] = Top;
    if(wc[u] != 0){
        dfs2(wc[u], Top);
        for(int i = 0; i < G[u].size(); ++i) if(G[u][i] != wc[u] && G[u][i] != fa[u]){
            dfs2(G[u][i], G[u][i]);
        }
    }
}

bool InRange(int L, int R, int l, int r){
    return (L >= l) && (R <= r);
}

bool OutofRange(int L, int R, int l, int r){
    return (L > r) || (R < l);
}

void pushup(const int u){
    w[u] = max(w[u*2], w[u*2+1]);
    w2[u] = w2[u*2] + w2[u*2+1];
}

void build(const int u, int L, int R){
    if(L == R){
        w2[u] = w[u] = a[rdfn[L]];
        return;
    }
    int mid = (L+R)>>1;
    build(u*2, L, mid);
    build(u*2+1, mid + 1, R);
    pushup(u);
}

void update(const int u, int L, int R, int l, int r, int x){
    if(InRange(L, R, l, r)){
        w2[u] = w[u] = x;
    }else if(!OutofRange(L, R, l, r)){
        int mid = (L+R)>>1;
        update(u*2, L, mid, l, r, x);
        update(u*2+1, mid + 1, R, l, r, x);
        pushup(u);
    }
}

int query(const int u, int L, int R, int l, int r){
    if(InRange(L, R, l, r)){
        return w[u];
    }else if(!OutofRange(L, R, l, r)){
        int mid = (L+R)>>1;
        return max(query(u*2,L,mid,l,r), query(u*2+1,mid+1,R,l,r));
    }else return 0;
}

int query2(const int u, int L, int R, int l, int r){
    if(InRange(L, R, l, r)){
        return w2[u];
    }else if(!OutofRange(L, R, l, r)){
        int mid = (L+R)>>1;
        return query2(u*2, L, mid, l, r) + query2(u*2+1, mid+1, R, l, r);
    }else return 0;
}

int qry(int x, int y){
    int ans = 0;
    while(top[x] != top[y]){
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		ans += query2(1, 1, n, dfn[top[x]], dfn[x]);
		x = fa[top[x]];
	} 
	ans += query2(1, 1, n, min(dfn[x], dfn[y]), max(dfn[x], dfn[y]));
	return ans;
}

int qry2(int x, int y){
	int ans = inf;
	while(top[x] != top[y]){
		if(dep[top[x]] < dep[top[y]]) swap(x, y);
		ans = max(ans, query(1, 1, n, dfn[top[x]], dfn[x]));
		x = fa[top[x]];
	}
	ans = max(ans, query(1, 1, n, min(dfn[x], dfn[y]), max(dfn[x], dfn[y])));
	return ans;
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);

    cin >> n;
    for(int i = 1;i < n; ++i){
        int x, y;
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    for(int i = 1; i <= n; ++i){cin >> a[i];}

    dfs1(1, 0);
    dfs2(1, 0);
    build(1, 1, n);

    cin >> q;
    while(q--){
        string s;
        cin >> s;
        int u, v, t;
        if(s == "CHANGE"){
            cin >> u >> t;
            update(1, 1, n, u, u, t);
        }else if(s == "QMAX"){
            cin >> u >> v;
            cout << qry2(u, v);
            if(q != 0)cout << '\n';
        }else{
            cin >> u >> v;
            cout << qry(u, v);
            if(q != 0) cout << '\n';
        }
    }

    return 0;
}
2024/9/28 09:37
加载中...