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
破案了,我需要按照二分的初值来写两种转移。