萌新求调树剖
查看原帖
萌新求调树剖
930325
Li_Yichen楼主2025/1/16 11:06

样例全过,求调

#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
#define int long long
int n,q;
struct node{
    int to;
    int next;
    int l;
}e[400005];
int cnt;
int head[200005];
int siz[200005],dep[200005];
int son[200005],father[200005];
int top[200005];
int tot;
int dfn[200005],id[200005];
int to[200005];
int val[200005];
struct segment{
    int l,r;
    int val;
}tree[1600005];
int lazy[1600005];
void pushup(int x){
    tree[x].val = tree[ls(x)].val + tree[rs(x)].val;
}
void pushdown(int x){
    if(lazy[x]){
        lazy[ls(x)] = lazy[x];
        lazy[rs(x)] = lazy[x];
        tree[ls(x)].val = lazy[x];
        tree[rs(x)].val = lazy[x];
        lazy[x] = 0;
    }
}
void build(int l,int r,int x){
    tree[x].l = l;
    tree[x].r = r;
    lazy[x] = 0;
    if(l == r){
        tree[x].val = val[id[l]];
        return ;
    }
    int mid = (l + r) / 2;
    build(l,mid,ls(x));
    build(mid+1,r,rs(x));
    pushup(x);
}
void modify(int ql,int qr,int l,int r,int x,int k){
    if(ql <= l && r <= qr){
        tree[x].val = k;
        lazy[x] = k;
        return ;
    }
    pushdown(x);
    int mid = (l + r) / 2;
    if(ql <= mid) modify(ql,qr,l,mid,ls(x),k);
    if(qr > mid) modify(ql,qr,mid+1,r,rs(x),k);
    pushup(x);
}
int query1(int ql,int qr,int l,int r,int x){
    if(ql <= l && r <= qr){
        return tree[x].val;
    }
    pushdown(x);
    int ans = 0;
    int mid = (l + r) / 2;
    if(ql <= mid) ans += query1(ql,qr,l,mid,ls(x));
    if(qr > mid) ans += query1(ql,qr,mid+1,r,rs(x));
    return ans;
}
int query2(int u,int v){
    int ans = 0;
    while(top[u] != top[v]){
        if(dep[top[u]] < dep[top[v]]) swap(u,v);
        ans += query1(dfn[top[u]],dfn[u],1,n,1);
        u = father[top[u]];
    }
    if(dep[u] < dep[v]) swap(u,v);
    ans += query1(dfn[v]+1,dfn[u],1,n,1);
    return ans;
}
void add(int u,int v,int l){
    e[++ cnt].to = v;
    e[cnt].next = head[u];
    e[cnt].l = l;
    head[u] = cnt;
}
void dfs1(int u,int fa){
    siz[u] = 1;
    father[u] = fa;
    dep[u] = dep[fa] + 1;
    for(int i=head[u];i;i=e[i].next){
        int v = e[i].to;
        if(v == fa) continue;
        dfs1(v,u);
        val[v] = e[i].l;
        siz[v] += siz[u];
        if(siz[son[u]] < siz[v]) son[u] = v;
    }
}
void dfs2(int u,int ntop){
    top[u] = ntop;
    dfn[u] = ++ tot;
    id[tot] = u;
    if(son[u]) dfs2(son[u],ntop);
    for(int i=head[u];i;i=e[i].next){
        int v = e[i].to;
        if(v == son[u] || v == father[u]) continue;
        dfs2(v,v);
    }
}
signed main(){
    cin >> n;
    for(int i=1;i<n;i++){
        int u,v,l;
        cin >> u >> v >> l;
        add(u,v,l);
        add(v,u,l);
        to[i] = v;
    }
    dfs1(1,0);
    dfs2(1,1);
    build(1,n,1);
    cin >> q;
    while(q --){
        int op;
        int u,v;
        cin >> op >> u >> v;
        if(op == 1) modify(dfn[to[u]],dfn[to[u]],1,n,1,v);
        else cout << query2(u,v) << endl;
    }
    return 0;
}
2025/1/16 11:06
加载中...