蒟蒻求助玄学TLE
查看原帖
蒟蒻求助玄学TLE
177069
李白莘莘学子楼主2020/11/30 10:37

用的二分,找不出tle的原因。

code:

#include<cstdio>
#include<iostream>
#include<cstring>
#define N 110006
#define ll long long
using namespace std;
int read()
{
	int ans=0;
	char ch=getchar(),last=' ';
	while(ch>'9'||ch<'0')last=ch,ch=getchar();
	while(ch>='0'&&ch<='9')ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
	return last=='-'?-ans:ans;
}
int n,k,a[N];
ll l,r;
int check(ll x)
{
	ll sum=0,ans=0;
	for(int i=1;i<=n;i++)
	{
		sum+=a[i];
		if(sum<0)sum=0;
		if(sum>=x)ans++,sum=0;
	}
	if(ans<k)return 2;//x大了 
	if(ans==k)return 1;
	if(ans>k)return 0;//x小了 
}
int main(){
	n=read(),k=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	l=1;r=2147493647000000;
	int jj=0;
	while(l<r)
	{
		int mid=(ll)(l+r)>>1;
		int judge=check(mid);
		if(judge==1)r=mid,jj=1;
		else if(!judge)l=mid+1;
		else r=mid;
	}
	if(!jj)
	{
		printf("-1");
		return 0;
	}
	printf("%lld ",l);
	l=1;r=2147493647000000;
	while(l<r)
	{
		ll mid=(ll)(l+r+1)>>1;
		int judge=check(mid);
		if(judge==1)l=mid,jj=1;
		else if(!judge)l=mid;
		else r=mid-1;
	}
	printf("%lld ",l);
	return 0;
}
2020/11/30 10:37
加载中...