#12 AC 其他 RE 求调
查看原帖
#12 AC 其他 RE 求调
528540
6k823楼主2024/9/7 20:39

rt,样例过了,然后 2h 没调出来

#include <bits/stdc++.h>
#define p2 (p << 1)
#define p3 (p << 1 | 1)
using namespace std;

const int maxn = 2e5 + 5;

struct edge{
    int v, w, ord;
};

int n, m;
vector<edge> g[maxn];

int vop[maxn], ooe[maxn];

int fa[maxn], siz[maxn], dep[maxn], dfn[maxn], dfncnt;
int top[maxn], rnk[maxn], son[maxn];
void dfs(int);
void dfs(int, int);

void upd(int, int);
int qry(int, int, int);

struct segmentr{
    int sum, maxx, minn, opr;
}tr[maxn << 2];
void build(int, int, int);
void modify_val(int, int, int, int, int);
void modify_opr(int, int, int, int, int);
int query(int, int, int, int, int, int);
void push_down(int);
void push_up(int);

void input();
void solve();

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();

    dep[1] = 1, dfs(1), dfs(1, 1);
    build(1, n, 1);

    while(m --) solve();

    return 0;
}

void solve(){
    string opr;
    int x, y;
    cin >> opr >> x >> y;

    if(opr == "C") modify_val(1, n, dfn[ooe[x]], y, 1);
    if(opr == "N") upd(x + 1, y + 1);
    if(opr == "SUM") cout << qry(x + 1, y + 1, 1) << '\n';
    if(opr == "MAX") cout << qry(x + 1, y + 1, 2) << '\n';
    if(opr == "MIN") cout << qry(x + 1, y + 1, 3) << '\n';
    return ;
}
void upd(int x, int y){
    while(top[x] != top[y]){
        if(dep[top[x]] < dep[top[y]]) swap(x, y);
        modify_opr(1, n, dfn[top[x]], dfn[x], 1);
        x = fa[top[x]];
    }
    if(dep[x] > dep[y]) swap(x, y);
    modify_opr(1, n, dfn[x] + 1, dfn[y], 1);
    return ;
}
int qry(int x, int y, int typ){
    int res = (typ == 1? 0: (typ == 2? -1e3: 1e3));
    while(top[x] != top[y]){
        if(dep[top[x]] < dep[top[y]]) swap(x, y);
        int t = query(1, n, dfn[top[x]], dfn[x], 1, typ);
        res = (typ == 1? (res + t): (typ == 2? max(res, t): min(res, t)));
        x = fa[top[x]];
    }
    if(dep[x] > dep[y]) swap(x, y);
    int t = query(1, n, dfn[x] + 1, dfn[y], 1, typ);
    res = (typ == 1? (res + t): (typ == 2? max(res, t): min(res, t)));
    return res;
}

void build(int lf, int rt, int p){
    if(lf == rt){
        tr[p].sum = tr[p].maxx = tr[p].minn = vop[rnk[lf]];
        tr[p].opr = 0;
        return ;
    }
    int mid = lf + rt >> 1;
    build(lf, mid, p2), build(mid + 1, rt, p3);
    push_up(p);
    return ;
}
void modify_val(int lf, int rt, int pos, int val, int p){
    if(lf == rt && lf == pos){
        tr[p].sum = tr[p].maxx = tr[p].minn = val;
        tr[p].opr = 0;
        return ;
    }
    push_down(p);
    int mid = lf + rt >> 1;
    if(pos <= mid) modify_val(lf, mid, pos, val, p2);
    else modify_val(mid + 1, rt, pos, val, p3);
    push_up(p);
    return ;
}
void modify_opr(int lf, int rt, int s, int t, int p){
    if(lf == s && rt == t){
        tr[p].opr ^= 1;
        tr[p].sum = -tr[p].sum, tr[p].maxx = -tr[p].maxx, tr[p].minn = -tr[p].minn;
        swap(tr[p].maxx, tr[p].minn);
        return ;
    }
    push_down(p);
    int mid = lf + rt >> 1;
    if(t <= mid) modify_opr(lf, mid, s, t, p2);
    else if(mid < s) modify_opr(mid + 1, rt, s, t, p3);
    else modify_opr(lf, mid, s, mid, p2), modify_opr(mid + 1, rt, mid + 1, t, p3);
    push_up(p);
    return ;
}
int query(int lf, int rt, int s, int t, int p, int typ){
    if(lf == s && rt == t){
        if(typ == 1) return tr[p].sum;
        if(typ == 2) return tr[p].maxx;
        return tr[p].minn;
    }
    push_down(p);
    int mid = lf + rt >> 1;
    if(t <= mid) return query(lf, mid, s, t, p2, typ);
    else if(mid < s) return query(mid + 1, rt, s, t, p3, typ);
    if(typ == 1) return query(lf, mid, s, mid, p2, typ) + query(mid + 1, rt, mid + 1, t, p3, typ);
    if(typ == 2) return max(query(lf, mid, s, mid, p2, typ), query(mid + 1, rt, mid + 1, t, p3, typ));
    return min(query(lf, mid, s, mid, p2, typ), query(mid + 1, rt, mid + 1, t, p3, typ));
}
void push_down(int p){
    tr[p2].opr ^= tr[p].opr, tr[p3].opr ^= tr[p].opr;
    if(tr[p].opr){
        tr[p2].sum = -tr[p2].sum, tr[p2].maxx = -tr[p2].maxx, tr[p2].minn = -tr[p2].minn;
        swap(tr[p2].maxx, tr[p2].minn);
        tr[p3].sum = -tr[p3].sum, tr[p3].maxx = -tr[p3].maxx, tr[p3].minn = -tr[p3].minn;
        swap(tr[p3].maxx, tr[p3].minn);
    }
    tr[p].opr = 0;
    return ;
}
void push_up(int p){
    tr[p].sum = tr[p2].sum + tr[p3].sum;
    tr[p].maxx = max(tr[p2].maxx, tr[p3].maxx);
    tr[p].minn = min(tr[p2].minn, tr[p3].minn);
    return ;
}

void dfs(int u){
    siz[u] = 1, son[u] = -1;
    int len = g[u].size();
    for(int i = 0; i < len; i ++){
        int v = g[u][i].v, w = g[u][i].w, ord = g[u][i].ord;
        if(dep[v]) continue;
        vop[v] = w, ooe[ord] = v;
        fa[v] = u, dep[v] = dep[u] + 1;
        dfs(v);
        siz[u] += siz[v];
        if(son[u] == -1 || siz[v] > siz[son[u]]) son[u] = v;
    }
    return ;
}
void dfs(int u, int t){
    top[u] = t, dfn[u] = (++ dfncnt), rnk[dfncnt] = u;
    if(son[u] == -1) return ;
    dfs(son[u], t);
    int len = g[u].size();
    for(int i = 0; i < len; i ++){
        int v = g[u][i].v;
        if(v == fa[u] || v == son[u]) continue;
        dfs(v, v);
    }
    return ;
}

void input(){
    cin >> n;
    for(int i = 1; i < n; i ++){
        int u, v, w;
        cin >> u >> v >> w;
        g[u + 1].push_back({v + 1, w, i});
        g[v + 1].push_back({u + 1, w, i});
    }
    cin >> m;
    return ;
}
2024/9/7 20:39
加载中...