o(n long n)的二分答案,求大佬帮看看(hack也行)
查看原帖
o(n long n)的二分答案,求大佬帮看看(hack也行)
475143
gaojian2007楼主2022/9/29 17:03
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long int n,a[1000005],l=1,r,b[1000005];
bool check(int x)
{
	for(int i=1;i<=n;i++)
	a[i]=b[i];
	int js=1,last=0,q[100005]={},p=0;
	for(int i=2;i<=n;i++)
	{
		if(a[i]==1234567890)
		continue;
		if(a[i]==a[i-1]+1)
		{
			p++;
			js++;
			if(last!=0)
			a[i]=1234567890;
			if(last!=0&&js>=x)
			{
				last=0;
				js=0;
				i=last;
			}
		}
		else
		{
			if(a[i]==a[i-1])
			{
				q[p]++;
				if(last==0)
				{
					if(js<x)
					last=i;
					else
					{
						if(q[p-1])
						{
							q[p-1]--;
							continue;
						}
						js=1;
						continue;
					}
				}
				else
				{
					continue;
				}
			}
			else
			{
				p+=2;
				if(js<x)
				return 0;
				else
				{
					if(last!=0)
					{
						return 0;
					}
					else
					{
						js=1;
						continue;
					}
				}
			}
		}
	}
	return js>=x;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",a+i);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	{
		b[i]=a[i];
	}
	r=n+1;
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check(mid))
		{
			l=mid+1;
		}
		else
		r=mid;
	}
	cout<<l-1;
	return 0;
}
2022/9/29 17:03
加载中...