有关于分治时处理多个最值
查看原帖
有关于分治时处理多个最值
201748
cinccout楼主2023/11/14 15:33

蒟蒻理解,多个最值时所求下标的 dpi−xidp_i-xi 和所求 dpk−xkdp_k-xk 应该是一样的吧,所以直接带入 kk 求值即可,那为什么 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 二分,求大佬解答!

2023/11/14 15:33
加载中...