蒟蒻刚学树剖 T^T, 0pts 求助
查看原帖
蒟蒻刚学树剖 T^T, 0pts 求助
747717
miss_A楼主2024/1/20 14:33

样例都没完全过......输出只对了 3 行......评测结果全 WA,看讨论区好像没有跟我一样错误的。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cctype>

using namespace std;
const int N = 3e5 + 5;
int d[N << 2], mx[N << 2];
int son[N], siz[N], fa[N], new_id[N], w[N], new_w[N], top[N], depth[N], cnt;
int n, q;

struct node
{
    int to, nex;    
};
node e[N << 1];
int head[N], tot;

namespace SP{
    void add(int u, int v){
        e[++tot].to = v;
        e[tot].nex = head[u];
        head[u] = tot;
    }
    void dfs1(int now, int fath){
        fa[now] = fath;
        depth[now] = depth[fath] + 1;
        siz[now] = 1, son[now] = 0;
        for(int i = head[now]; i; i = e[i].nex){
            if(e[i].to != fa[now]){
                dfs1(e[i].to, now);
                siz[now] += siz[e[i].to];
                if(siz[son[now]] < siz[e[i].to]){
                    son[now] = e[i].to;
                }
            }
        }
    }
    void dfs2(int now, int topx){
        top[now] = topx;
        new_id[now] = ++cnt;
        new_w[cnt] = w[now];
        if(son[now])dfs2(son[now], topx);
        else return ;
        for(int i = head[now]; i; i = e[i].nex){
            if(e[i].to != fa[now] && e[i].to != son[now])
                dfs2(e[i].to, e[i].to);
        }
    }
}

namespace segt{
    void pushup(int p){
        d[p] = d[p << 1] + d[p << 1|1];
        mx[p] = max(mx[p << 1], mx[p << 1|1]);
    }

    void update(int p, int l, int r, int u, int t){
        if(l == r){
            d[p] = t;
            mx[p] = t;
            return ;
        }
        int mid = l + ((r - l) >> 1);
        if(u <= mid)update(p << 1, l, mid, u, t);
        else update(p << 1|1, mid + 1, r, u, t);
        pushup(p);
    }
    int QueryMax(int p, int l, int r, int x, int y){
        int res = -N;
        if(l >= x && r <= y){
            return mx[p];
        }
        int mid = l + ((r - l) >> 1);
        if(x <= mid) 
			res = max(res, QueryMax(p << 1, l, mid, x, y));
        if(y > mid) 
			res = max(res, QueryMax(p << 1|1, mid + 1, r, x, y));
        return res;
    }
    int QuerySum(int p, int l, int r, int x, int y){
        int res = 0;
        if(l >= x && r <= y){
            return d[p];
        }
        int mid = l + ((r - l) >> 1);
        if(x <= mid)
			res += QuerySum(p << 1, l, mid, x, y);
        if(y > mid)
			res += QuerySum(p << 1|1, mid + 1, r, x, y);
        return res;
    }

    int getMax(int x, int y){
        int res = -N;
        while(top[x] != top[y]){
            if(top[x] < top[y])swap(x, y);
            res = max(res, QueryMax(1, 1, n, new_id[top[x]], new_id[x]));
            x = fa[top[x]];
        }
        if(new_id[x] > new_id[y])swap(x, y);
        res = max(res, QueryMax(1, 1, n, new_id[x], new_id[y]));
        return res;
    }
    int getsum(int x, int y){
        int res = 0;
        while(top[x] != top[y]){
            if(top[x] < top[y])swap(x, y);
            res += QuerySum(1, 1, n, new_id[top[x]], new_id[x]);
            x = fa[top[x]];
        }
        if(new_id[x] > new_id[y])swap(x, y);
        res += QuerySum(1, 1, n, new_id[x], new_id[y]);
        return res;
    }
}

int main(){

    //freopen("code.in", "r", stdin);
    //freopen("code.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;
    for(int i = 1; i <= n-1; i++){
        int u, v;
        cin >> u >> v;
        SP::add(u, v), SP::add(v, u);
    }
    SP::dfs1(1, 0);
    for(int i = 1; i <= n; i++){
        cin >> w[i];
    }
    SP::dfs2(1, 1);
	//cout << "------" <<endl;
    cin >> q;
    for (int i = 1; i <= q; i++) {
    	string s;
    	cin >> s;
    	if (s[0] == 'C') {
        	int u, t;
        	cin >> u >> t;
        	segt::update(1, 1, n, u, t);
    	} else if (s[1] == 'M') {
        	int u, v;
        	cin >> u >> v;
        	int ans = segt::getMax(u, v);
        	cout << ans << endl;
    	} else if (s[1] == 'S') {
        	int u, v;
        	cin >> u >> v;
        	int ans = segt::getsum(u, v);
        	cout << ans << endl;
    	}
	}

    return 0;
}
2024/1/20 14:33
加载中...