求助,95pts
查看原帖
求助,95pts
209112
轮换对称式楼主2023/7/25 09:32

#14 Wa ,提示有解,我的程序无解

#include <bits/stdc++.h>
using namespace std;
#define LL long long
int l , k;
LL line , x[100005] , mi , ma;
LL nl , ml;
bool f;

inline LL q_read()
{
	LL f = 1 , x = 0;
	char c = getchar();
	while (c < '0' || c > '9')
	{
		if (c == '-')
			f = -1*f;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
	{
		x = (x<<3) + (x<<1) + (c^48);
		c = getchar();
	}
	return x*f;
}

int se(LL mid)
{
	LL ans = 0 , now = 0;
	for (int i = 0 ; i < l ; ++i)
	{
		now += x[i];
		if (now < 0)
			now = 0;
		else if (now >= mid)
		{
			now = 0;
			ans++;
		}
	}
	if (ans == k)
		return 0;
	else if (ans > k)
		return 1;
	return 2;
}

void devi(LL le , LL ri)
{
	LL mid = (le+ri) >> 1;
	if (mid < ma && mid > mi)
		return;
	int flag = se(mid);
	if (flag == 0)
	{
		f = 1;
		mi = min(mi , mid);
		ma = max(ma , mid);
		if (le >= ri)
			return;
		devi(le , mid);
		devi(mid+1 , ri);
		return;
	}
	if (le >= ri)
		return;
	if (flag == 1)
		devi(mid+1 , ri);
	else if (flag == 2)
		devi(le , mid-1);
}


int main()
{
	f = 0;
	cin >> l >> k;
	for (int i = 0 ; i < l ; ++i)
	{
		scanf("%lld" , &x[i]);
		if (x[i] >= 0)
		{
			nl += x[i];
			ml = max(ml , nl);
		}
		else
			nl = 0;
	}
	mi = ml+10;
	ma = 1;
	LL mid = (ml) >> 1;
	devi(1 , ml);
	if (f)
		printf("%lld %lld" , mi , ma);
	else
		printf("-1");
	return 0;
}


2023/7/25 09:32
加载中...