求助站外题(RE)
查看原帖
求助站外题(RE)
941575
Stars_visitor_tyw楼主2024/4/11 21:45

题目:https://loj.ac/p/10121

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[200005][32], a[200005], n, m, lg[200005], mp[10000007];
void init()
{
    for(int i=1;i<=n;i++)
    {
        dp[i][0]=min(i-mp[a[i]],dp[i-1][0]+1);
        mp[a[i]]=i;
    }
	lg[0]=-1;
	for(int i=1;i<=n;i++)
	{
		lg[i]=lg[i>>1]+1;
	}
	for(int j=1;(1<<j)<=n;j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
		}
	}
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
        a[i]+=1e6;
	}
	init();
    for(int i=1;i<=m;i++)
    {
        int x, y, lt, rt;
        cin>>x>>y;
        x++,y++;
        lt=x,rt=y+1;
        while(lt+1<rt)
        {
            int mid=(lt+rt)>>1;
            if(mid-dp[mid][0]+1<=x)
            {
                lt=mid;
            }
            else
            {
                rt=mid;
            }
        }
		int mi=lg[y-rt+1];
		cout<<max(rt-x,max(dp[rt][mi],dp[y-(1<<mi)+1][mi]))<<"\n";
    }
}
2024/4/11 21:45
加载中...