社区讨论

为什么这种二分写法是错误的?

P4343[SHOI2015] 自动刷题机参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjrtvci
此快照首次捕获于
2025/11/04 07:28
4 个月前
此快照最后确认于
2025/11/04 07:28
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
int n;
LL k,a[100005];

int check(LL mid) {
	LL now=0;
	int cnt = 0;
	for(int i=1;i<=n;i++) {
		now = max(now+a[i],0ll);
		if(now>=mid) now=0,cnt++;
	}
	return cnt;
}

int main() {
	
	scanf("%d%lld",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%lld",a+i);
	LL l = 1, r = 4e18;
	while(l<=r) {
		LL mid = (l+r)>>1;
		if(check(mid)<k)
			r = mid-1;
		else l = mid+1;
	}
	if(check(r)!=k)
		return printf("-1"),0;
	int R = r;
	l = 1, r = 4e18;
	while(l<=r) {
		LL mid = (l+r)>>1;
		if(check(mid)>k)
			l = mid+1;
		else r = mid-1;
	}
	printf("%lld %lld",l,R);
	
	return 0;
}

回复

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

正在加载回复...