1 条题解

  • 0
    @ 2026-4-12 15:16:46
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define PII pair<int,int>
    #define fi first
    #define se second
    const int N=2e5+10;
    int a[N],n;
    bool check(int x)
    {
    	if(x==1)
    	{
    		for(int i=1;i<n;i++)if(a[i]>=a[i+1])return 0;
    		return 1;
    	}
    	vector<PII>stk;int len=0;
    	for(int i=1;i<=n;i++)
    	{
    		if(a[i]>len)len=a[i];
    		else if(a[i]==len)
    		{
    			int id=len;
    			while(!stk.empty()&&stk.back().fi==id&&stk.back().se==x-1)stk.pop_back(),id--;
    			if(id==0)return 0;
    			if(!stk.empty()&&stk.back().fi==id)
    			{
    				int x=stk.back().se;
    				stk.pop_back();stk.push_back({id,x+1});
    			}
    			else stk.push_back({id,1});
    		}
    		else
    		{
    			while(!stk.empty()&&stk.back().fi>a[i])stk.pop_back();
    			int id=a[i];
    			while(!stk.empty()&&stk.back().fi==id&&stk.back().se==x-1)stk.pop_back(),id--;
    			if(id==0)return 0;
    			if(!stk.empty()&&stk.back().fi==id)
    			{
    				int x=stk.back().se;
    				stk.pop_back();stk.push_back({id,x+1});
    			}
    			else stk.push_back({id,1});
    		}
    		len=a[i];
    	}
    	return 1;
    }
    signed main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	int l=1,r=1e9,ans=1e9;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(check(mid))r=mid-1,ans=mid;
    		else l=mid+1;
    	}
    	cout<<ans;
    	return 0;
    }
    • 1

    信息

    ID
    8634
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    4
    已通过
    2
    上传者