#11 AC 其他WA
查看原帖
#11 AC 其他WA
755820
fush楼主2024/9/20 08:43
#include<bits/stdc++.h>
#define endl '\n'
#define L(a, b, c) for(int a = (b); a <= (c); a++)
#define R(a, b, c) for(int a = (b); a >= (c); a--)
#define ll long long
using namespace std;
template<typename type>
inline type Max(type a, type b){
    return (a>b?a:b);
}
template<typename type>
inline type Min(type a, type b){
    return (a<b?a:b);
}
#define int ll
const int N = 2e5 + 10, sp = -1;
struct node{
    int son, size, top, id;
    int dep, fa;
}d[N];
struct segments{
    int maxn, lazy, minn, w, l, r;
}sg[N << 2];
int a[N], cnt, n, r[N];
int w1[N], w2[N];
vector<int>e[N];
vector<int>w[N];
#define ls (u << 1)
#define rs (u << 1 | 1)
void pushup(int u){
    sg[u].w = sg[ls].w + sg[rs].w;
    sg[u].minn = Min(sg[ls].minn, sg[rs].minn);
    sg[u].maxn = Max(sg[ls].maxn, sg[rs].maxn);
}
void change(int u){
    sg[u].lazy ^= 1;
    sg[u].w *= -1;
    swap(sg[u].maxn, sg[u].minn);
    sg[u].maxn = -sg[u].maxn, sg[u].minn = -sg[u].minn;
}
void pushdown(int u){
    if(sg[u].lazy){
        change(ls), change(rs);
        sg[u].lazy = 0;
    }
}
void build(int u, int L, int R){
    sg[u].l = L, sg[u].r = R;
    if(L == R){
        sg[u].maxn = sg[u].minn = sg[u].w = r[L];
        return;
    }
    int mid = L + R >> 1;
    build(ls, L, mid);
    build(rs, mid + 1, R);
}
int queryadd(int u, int L, int R){
    if(L <= sg[u].l && sg[u].r <= R)
        return sg[u].w;
    int mid = sg[u].l + sg[u].r >> 1;
    int sum = 0;
    pushdown(u);
    if(L <= mid)sum = queryadd(ls, L, R);
    if(mid < R)sum += queryadd(rs, L, R);
    return sum;
}
int querymax(int u, int L, int R){
    if(L <= sg[u].l && sg[u].r <= R)
        return sg[u].maxn;
    int mid = sg[u].l + sg[u].r >> 1;
    int sum = -1e9;
    pushdown(u);
    if(L <= mid)sum = querymax(ls, L, R);
    if(mid < R)sum = Max(querymax(rs, L, R), sum);
    return sum;
}
int querymin(int u, int L, int R){
    if(L <= sg[u].l && sg[u].r <= R)
        return sg[u].minn;
    int mid = sg[u].l + sg[u].r >> 1;
    pushdown(u);
    int sum = 1e9;
    if(L <= mid)sum = querymin(ls, L, R);
    if(mid < R)sum = Min(querymin(rs, L, R), sum);
    return sum;
}
void modify1(int u, int x, int v){
    if(sg[u].l == sg[u].r){
        sg[u].w = sg[u].maxn = sg[u].minn = v;
        return;
    }
    int mid = sg[u].l + sg[u].r >> 1;
    pushdown(u);
    if(x <= mid)modify1(ls, x, v);
    else modify1(rs, x, v);
    pushup(u);
}
void modify2(int u, int L, int R){
    if(L <= sg[u].l && sg[u].r <= R){
        change(u);
        return;
    }
    int mid = sg[u].l + sg[u].r >> 1;
    pushdown(u);
    if(L <= mid)modify2(ls, L, R);
    if(mid < R)modify2(rs, L, R);
    pushup(u);
}
void dfs1(int x, int dep){
    d[x].dep = dep;
    d[x].size = 1;
    int maxsize = -1;
    L(i, 1, e[x].size()){
        int v = e[x][i - 1];
        if(v == d[x].fa)continue;
        a[v] = w[x][i - 1];
        d[v].fa = x; 
        dfs1(v, dep + 1);
        d[x].size += d[v].size;
        if(d[v].size > maxsize)
            maxsize = d[v].size, d[x].son = v;
    }
}
void dfs2(int x, int top){
    d[x].top = top;
    d[x].id = ++cnt;
    r[cnt] = a[x];
    if(!d[x].son)return;
    dfs2(d[x].son, top);
    L(i, 1, e[x].size()){
        int v = e[x][i - 1];
        if(v == d[x].fa || v == d[x].son)continue;
        dfs2(v, v);
    }
}
void modify(int x, int y){
    while(d[x].top != d[y].top){
        if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
        modify2(1, d[d[x].top].id, d[x].id);
        x = d[d[x].top].fa;
    }
    if(d[x].dep > d[y].dep)swap(x, y);
    if(x != y)modify2(1, d[d[x].son].id, d[y].id);
}
int queryadd(int x, int y){
    int ans = 0;
    while(d[x].top != d[y].top){
        if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
        ans += queryadd(1, d[d[x].top].id, d[x].id);
        x = d[d[x].top].fa;
    }
    if(d[x].dep > d[y].dep)swap(x, y);
    if(x != y) ans += queryadd(1, d[d[x].son].id, d[y].id);
    return ans;
}
int querymin(int x, int y){
    int ans = 1e9;
    while(d[x].top != d[y].top){
        if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
        ans = Min(querymin(1, d[d[x].top].id, d[x].id), ans);
        x = d[d[x].top].fa;
    }
    if(d[x].dep > d[y].dep)swap(x, y);
    if(x != y)ans = Min(ans, querymin(1, d[d[x].son].id, d[y].id));
    return ans;
}
int querymax(int x, int y){
    int ans = -1e9;
    while(d[x].top != d[y].top){
        if(d[d[x].top].dep < d[d[y].top].dep)swap(x, y);
        assert(d[d[x].top].id <= d[x].id);
        ans = Max(querymax(1, d[d[x].top].id, d[x].id), ans);
        x = d[d[x].top].fa;
    }
    if(d[x].dep > d[y].dep)swap(x, y);
    if(x != y)ans = Max(ans, querymax(1, d[d[x].son].id, d[y].id));
    return ans;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n;
    freopen("P1505_1.in", "r", stdin);
    freopen("1.txt", "w", stdout);
    cin >> n;
    L(i, 2, n){
        int u, v, z;
        cin >> u >> v >> z;
        u++, v++;
        w1[i] = u, w2[i] = v; 
        e[u].push_back(v);
        e[v].push_back(u);
        w[u].push_back(z);
        w[v].push_back(z);
    }
    dfs1(1, 0);
    dfs2(1, 1);
    build(1, 1, n);
    int m;
    cin >> m;
    while(m--){
        string op;
        int l, r;
        cin >> op >> l >> r;
        l++, r++;
        if(op[0] == 'C'){
            int z;
            if(d[w1[l]].dep > d[w2[l]].dep)z = w1[l];
            else z = w2[l];
            modify1(1, d[z].id, r - 1);
        }
        if(op[0] == 'N')modify(l, r);
        if(op[0] == 'S')cout << queryadd(l, r) << endl;
        if(op[1] == 'A')cout << querymax(l, r) << endl;
        if(op[1] == 'I')cout << querymin(l, r) << endl;
    }
	return 0;
}
2024/9/20 08:43
加载中...