MnZn 求助神笔 RE
查看原帖
MnZn 求助神笔 RE
420129
Nt_Tsumiki楼主2024/7/5 19:49

RT

在李超树的 upd 中给 x 赋值时,大概 tcnt 达到 20 多就会奇妙 RE,有没有佬帮忙看看。

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

#define N 200001
#define LL long long

using namespace std;
int n,T,maxn,fa[N],p[N]; LL _l[N],q[N],f[N];

int cnt,head[N];
struct Node { int to,nxt; LL dis; }e[N];

void add(int u,int v,LL w) { e[++cnt]=Node{v,head[u],w},head[u]=cnt; }

struct LCT {
    int tcnt,rt[N<<2];
    struct Tree { LL k,b; int ls,rs; }t[N<<6];

    void upd(int &x,int l,int r,LL k,LL b) {
        if (!x) t[x=++tcnt]={(LL)-1e9,(LL)-1e9,0,0};
        int mid=(l+r>>1);
        if (t[x].k*mid+t[x].b<k*mid+b) swap(t[x].k,k),swap(t[x].b,b);
        // if (l==r) return; 
        LL tmpl=k*l+b-t[x].k*l-t[x].b,tmpr=k*r+b-t[x].k*r-t[x].b;
        if (tmpl>0 or (!tmpl and k>t[x].k)) upd(t[x].ls,l,mid,k,b);
        if (tmpr>0 or (!tmpr and k>t[x].k)) upd(t[x].rs,mid+1,r,k,b);
    }

    LL ask(int x,int l,int r,int pos) {
        if (!x) return 0;
        if (l==r) return t[x].k*pos+t[x].b;
        LL res=t[x].k*pos+t[x].b; int mid=(l+r>>1);
        if (pos<=mid) return max(res,ask(t[x].ls,l,mid,pos));
        else return max(res,ask(t[x].rs,mid+1,r,pos));
    }
}lct;

void upd(int x,int l,int r,int pos,LL k,LL b) {
    lct.upd(lct.rt[x],0,maxn,k,b);
    if (l==r) return;
    int mid=(l+r>>1);
    if (pos<=mid) upd(x<<1,l,mid+1,pos,k,b);
    else upd(x<<1|1,mid+1,r,pos,k,b);
}

LL ask(int x,int l,int r,int L,int R,int k) {
    if (L<=l and r<=R) return lct.ask(lct.rt[x],0,maxn,k);
    int mid=(l+r>>1); LL res=0;
    if (L<=mid) res=max(res,ask(x<<1,l,mid,L,R,k));
    if (R>mid) res=max(res,ask(x<<1|1,mid+1,r,L,R,k));
    return res;
}

int idcnt,siz[N],son[N],dep[N],top[N],id[N],nid[N]; LL dis[N],tdis[N];

void dfs1(int u) {
    siz[u]=1,dep[u]=dep[fa[u]]+1;
    for (int i=head[u];i;i=e[i].nxt) {
        int v=e[i].to;
        dis[v]=dis[u]+e[i].dis;
        dfs1(v);
        siz[u]+=siz[v];
        if (siz[v]>siz[son[u]]) son[u]=v;
    }
}

void dfs2(int u,int Top) {
    top[u]=Top,nid[id[u]=++idcnt]=u,tdis[id[u]]=dis[u];
    if (son[u]) dfs2(son[u],Top);
    for (int i=head[u];i;i=e[i].nxt) {
        int v=e[i].to;
        if (v==son[u]) continue;
        dfs2(v,v);
    }
}

LL ask(int x) {
    int tx=x; LL res=0;
    while (x) {
        int l=id[top[x]],r=id[x];
        if (dis[tx]-tdis[l]>_l[tx]) {
            l=lower_bound(tdis+l,tdis+r+1,dis[tx]-_l[tx])-tdis-l+1;
            res=max(res,ask(1,1,n,l,r,p[tx]));
            break;
        } else {
            res=max(res,ask(1,1,n,l,r,p[tx]));
            x=fa[top[x]];
        }
    }
    return res;
}

int main() {
    scanf("%d%d",&n,&T);
    for (int i=2;i<=n;i++) {
        LL x;
        scanf("%d%lld%d%lld%lld",fa+i,&x,p+i,q+i,_l+i);
        add(fa[i],i,x); maxn=max(maxn,p[i]);
    }
    dfs1(1); dfs2(1,1);
    // printf("1\n");
    for (int i=2;i<=n;i++) {
        f[nid[i]]=ask(nid[i])+q[nid[i]]+1ll*p[nid[i]]*dis[nid[i]];
        upd(1,1,n,i,-dis[nid[i]],f[nid[i]]);
    }
    for (int i=2;i<=n;i++) printf("%d\n",f[i]);
    return 0;
}
2024/7/5 19:49
加载中...