60pts求助,悬关。

P4383 [八省联考 2018] 林克卡特树

hegm @ 2024-01-22 17:25:54

最后几个点显示我输出了负数。

#include<bits/stdc++.h>
#define N 300005 
#define int long long
#define inf 1000000000000000000
using namespace std;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct fig
{
    int to,next,w;
}k[N*2];int head[N],tot,n,K,X;
void add(int from,int to,int w)
{
    k[++tot].to=to;
    k[tot].w=w;
    k[tot].next=head[from];
    head[from]=tot;
}
struct node
{
    int w,s;
    friend bool operator <(const node &a,const node &b)
    {
        if(a.w==b.w) return a.s<b.s;
        else return a.w<b.w;
    }
    friend node operator +(const node &a,const node &b)
    {
        return node{a.w+b.w,a.s+b.s};
    }
}f[N][3];
void dfs(int now,int fa)
{
    f[now][0]=node{0,0};
    f[now][1]=node{-inf,0};
    f[now][2]=node{-inf,0};
    for(int i=head[now],to,w;i;i=k[i].next)
    {
        to=k[i].to;w=k[i].w;
        if(to==fa)continue;
        dfs(to,now);
        node p=max({f[to][0],f[to][1],f[to][2]});
        f[now][2]=max(f[now][2]+p,f[now][1]+max(f[to][1]+node{w-X,-1},f[to][0]+node{w,0}));
        f[now][1]=max(f[now][1]+p,f[now][0]+max(f[to][1]+node{w,0},f[to][0]+node{w+X,1}));
        f[now][0]=f[now][0]+p;
    }
}
int check(int x)
{
    X=x;
    dfs(1,0);
    node p=max({f[1][1],f[1][2],f[1][0]});
    return p.s;
}
signed main()
{
    n=read();K=read();
    for(int i=1,u,v,w;i<n;i++)
    {
        u=read();v=read();w=read();
        add(u,v,w);add(v,u,w);
    }
    int l=-inf,r=inf,mid;
    while(l<=r)
    {
        mid=(l+r)>>1;
        int p=check(mid);
        if(p==K+1)break;
        else if(p>K+1)r=mid-1;
        else l=mid+1;
    }
    check(mid);
    node p=max({f[1][1],f[1][2],f[1][0]});
    cout<<p.w-mid*(K+1);
    return 0;
}

by joseph0530 @ 2024-01-22 18:01:37

@hegm 输出负数那就是爆long long了


by joseph0530 @ 2024-01-22 18:02:06

@hegm 不过这题不能爆long long啊


by hegm @ 2024-01-23 08:11:47

@joseph0530 我感觉可能是二分错误了,导致wqs的修正让它变成了负数。


by hegm @ 2024-01-26 08:40:16

破案了,我需要按照二分的初值来写两种转移。


|