请求hack/求助
查看原帖
请求hack/求助
206423
焚魂楼主2024/9/22 12:27

调了一天了,讨论里的各种hack也都是对的,但是就是10pts

救救孩子qwq

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

long long n,head[4000010],tot,maxv[4000010],dis[1000010],mod[4000010],add[4000010],x[1000010],y[1000010],z[1000010];
long long father[1000010],seg[1000010],rev[1000010],size[1000010],dep[1000010],son[1000010],top[1000010];
struct node{
    long long next,v,w;
}cnt[4000010];

void insert(long long u,long long v,long long w) {
    cnt[++tot].next = head[u];
    cnt[tot].v = v;
    cnt[tot].w = w;
    head[u] = tot;
}

void dfs1(long long u,long long fat) {
    dep[u] = dep[fat] + 1;
    size[u] = 1;
    father[u] = fat;
    for(long long i = head[u];i;i = cnt[i].next) {
        if(cnt[i].v == fat) continue;
        dis[cnt[i].v] = cnt[i].w;
        dfs1(cnt[i].v,u);
        size[u] += size[cnt[i].v];
        if(size[cnt[i].v] > size[son[u]]) 
            son[u] = cnt[i].v;
    }
}

void dfs2(long long u,long long fat) {
    if(son[u]) {
        top[son[u]] = top[u];
        seg[son[u]] = ++seg[0];
        rev[seg[0]] = son[u];
        dfs2(son[u],u);
    }
    for(long long i = head[u];i;i = cnt[i].next) {
        if(!top[cnt[i].v]) {
            top[cnt[i].v] = cnt[i].v;
            seg[cnt[i].v] = ++seg[0];
            rev[seg[0]] = cnt[i].v;
            dfs2(cnt[i].v,u);
        }
    }
}

void build(long long k,long long l,long long r) {
    if(l == r) {
        maxv[k] = dis[rev[l]];
        return;
    }
    long long mid = l+r>>1;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}

void Mod(long long k,long long l,long long r,long long v) {
    mod[k] = v;
    maxv[k] = v;
}

void Add(long long k,long long l,long long r,long long v) {
    add[k] += v;
    maxv[k] += v;
}

void pushdown(long long k,long long l,long long r,long long mid) {
    if(add[k] != 0) {
        Add(k*2,l,mid,add[k]);
        Add(k*2+1,mid+1,r,add[k]);
    }
    if(mod[k] != 0) {
        Mod(k*2,l,mid,mod[k]);
        Mod(k*2+1,mid+1,r,mod[k]);
        mod[k] = 0;
    }
    add[k] = 0;
}

void modify1(long long k,long long l,long long r,long long x,long long y,long long v) {
    if(l > y || r < x) return;
    if(l >= x && r <= y) return Mod(k,l,r,v);
    long long mid = (l+r)>>1;
    pushdown(k,l,r,mid);
    modify1(k*2,l,mid,x,y,v);
    modify1(k*2+1,mid+1,r,x,y,v);
    maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}

void modify2(long long k,long long l,long long r,long long x,long long y,long long v) {
    if(l > y || r < x) return;
    if(l >= x && r <= y) return Add(k,l,r,v);
    long long mid = (l+r)>>1;
    pushdown(k,l,r,mid);
    modify2(k*2,l,mid,x,y,v);
    modify2(k*2+1,mid+1,r,x,y,v);
    maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}

long long query(long long k,long long l,long long r,long long x,long long y) {
    if(l > y || r < x) return 0;
    if(l >= x && r <= y) return maxv[k];
    long long mid = (l+r)>>1;
    pushdown(k,l,r,mid);
    long long res = 0;
    res = max(res,query(k*2,l,mid,x,y));
    res = max(res,query(k*2+1,mid+1,r,x,y));
    return res;
}

void change(long long k,long long l,long long r,long long x,long long v) {
    if(l > r) return;
    if(l > x || r < x) return;
    if(l == r && l == x) {
        maxv[k] = dis[rev[x]] = v;
        return;
    }
    long long mid = l+r>>1;
    change(k*2,l,mid,x,v);
    change(k*2+1,mid+1,r,x,v);
    maxv[k] = max(maxv[k*2],maxv[k*2+1]);
}

long long ask(long long x,long long y) {
    long long res = 0;
    long long fx = top[x],fy = top[y];
    while(fx != fy) {
        if(dep[fx] < dep[fy]) swap(x,y),swap(fx,fy);
        res = max(res,query(1,1,seg[0],seg[fx],seg[x]));
        x = father[fx];
        fx = top[x];
    }
    if(dep[x] > dep[y]) swap(x,y);
    res = max(res,query(1,1,seg[0],seg[x]+1,seg[y]));
    return res;
}

void treemod(int x,int y,int flag,int v) {
    int fx = top[x],fy = top[y];
    while(fx != fy) {
        if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
        if(flag == 1) modify1(1,1,seg[0],seg[fx],seg[x],v);
        else modify2(1,1,seg[0],seg[fx],seg[x],v);
        x = father[fx];
        fx = top[x];
    }
    if(dep[x] > dep[y]) swap(x,y);
    if(flag == 1) modify1(1,1,seg[0],seg[x]+1,seg[y],v);
    else modify2(1,1,seg[0],seg[x]+1,seg[y],v);
}

int main() {
    cin >> n;
    for(long long i = 1;i < n;i++) {
        cin >> x[i] >> y[i] >> z[i];
        insert(x[i],y[i],z[i]);
        insert(y[i],x[i],z[i]);
    }
    dfs1(1,0);
    top[1] = 1;
    seg[1] = ++seg[0];
    rev[seg[0]] = 1;
    dfs2(1,0);
    build(1,1,seg[0]);

    string ins;
    while(1) {
        cin >> ins;
        if(ins == "Stop") break;
        long long l1,l2,l3;
        if(ins == "Change") {
            cin >> l1 >> l2;
            if(dep[x[l1]] > dep[y[l1]]) {
                change(1,1,seg[0],seg[x[l1]],l2);
            }
            else {
                change(1,1,seg[0],seg[y[l1]],l2);
            }
        }
        else if(ins == "Cover") {
            cin >> l1 >> l2 >> l3;
            treemod(l1,l2,1,l3);
        }
        else if(ins == "Add"){
            cin >> l1 >> l2 >> l3;
            treemod(l1,l2,2,l3);
        }
        else {
            cin >> l1 >> l2;
            cout << ask(l2,l1) << "\n";
        }
    }

    return 0;
}
2024/9/22 12:27
加载中...