社区讨论

决策单调性的二分部分求助

P3195[HNOI2008] 玩具装箱参与者 6已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@m6tzykbs
此快照首次捕获于
2025/02/07 07:57
去年
此快照最后确认于
2025/11/04 09:51
4 个月前
查看原帖
这是 AC 代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+6;
int now=1,n,L,c[N],sum[N],top=1,f[N];
struct node{int l,r,x;}q[N];
int w(int i,int j){
	int res=sum[j]-sum[i]-L;
	res+=j-i-1;
	return res*res;
}
int find(int i){
	int l=q[top].l,r=q[top].r,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(f[i]+w(i,mid)<f[q[top].x]+w(q[top].x,mid))r=mid-1,ans=mid;
		else l=mid+1;
	}
	return l;
}
signed main(){
	cin>>n>>L;
	for(int i=1;i<=n;i++){
		cin>>c[i];
		sum[i]=sum[i-1]+c[i];
	}
	now=top=1;
	q[top]=(node){1,n,0};
	for(int i=1;i<=n;i++){
	//	cout<<now<<" "<<top<<endl;
		f[i]=f[q[now].x]+w(q[now].x,i);
		while(i<q[top].l&&f[i]+w(i,q[top].l)<f[q[top].x]+w(q[top].x,q[top].l))top--;
		int u=find(i);
		q[top].r=u-1;
		if(u<=n)q[++top]=(node){u,n,i};
		if(i==q[now].r)now++;
	}
	cout<<f[n]<<endl;
	return 0;
}
但是为什么我把二分部分改成
CPP
int find(int i){
	int l=q[top].l,r=q[top].r,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(f[i]+w(i,mid)<f[q[top].x]+w(q[top].x,mid))r=mid-1,ans=mid;
		else l=mid+1;
	}
	return ans;
}
就会挂

回复

6 条回复,欢迎继续交流。

正在加载回复...