蒟蒻理解,多个最值时所求下标的 dpi−xi 和所求 dpk−xk 应该是一样的吧,所以直接带入 k 求值即可,那为什么 link 的提交是错的,而 link 的提交是对的啊awa
前者的实现:
int main()
{
int k,aa,bb,cc;cin>>n>>k;k++;
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&aa,&bb,&cc);
add(aa,bb,cc);add(bb,aa,cc);
}
long long L=-1e13,R=1e13;
long long pos=0,fans=0;
while(L<=R)
{
long long mid=(L+R)>>1;dfs(1,0,mid);
dpv ans=max(dp[1][0],max(dp[1][1],dp[1][2]));
//cout<<mid<<"is"<<ans.val<<" "<<ans.x<<endl;
if(ans.x>k) L=mid+1;
else//k增加,最小值位置变小
{
R=mid-1;pos=mid;
fans=ans.val+k*mid;
}
}
cout<<fans;
return 0;
}
后者的实现:
//...
//前面的部分相同
int main()
{
int k,aa,bb,cc;cin>>n>>k;k++;
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&aa,&bb,&cc);
add(aa,bb,cc);add(bb,aa,cc);
}
long long L=-1e13,R=1e13;
long long pos=0,fans=0;
while(L<=R)
{
long long mid=(L+R)>>1;dfs(1,0,mid);
dpv ans=max(dp[1][0],max(dp[1][1],dp[1][2]));
//cout<<mid<<"is"<<ans.val<<" "<<ans.x<<endl;
if(ans.x>k) L=mid+1;//k增加,最小值位置变小
else
{
R=mid-1;pos=mid;
fans=ans.val+ans.x*mid;
}
}
cout<<fans;
return 0;
}
萌新刚学 wqs 二分,求大佬解答!