UKE求助(玄关)
查看原帖
UKE求助(玄关)
930119
_Sonnet楼主2024/4/9 20:02

RT

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 100;
int n , m , ans;
int a[N];
int st[N][30];
int mp[N];
void find(){
	for(int i = 1 ; i < 20 ; i ++)
    {
		for(int j = 1 ; j + (1 << i) - 1 <= n ; j ++)
        {
			st[j][i] = max(st[j][i - 1] , st[(1 << i - 1) + j][i - 1]);
            //st2[j][i] = min(st2[j][i - 1] , st2[(1 << i - 1) + j][i - 1]);
		}
	}
}
int cal(int l , int r)
{
    if(l > r)
        return 0;
	int len = log2(r - l + 1);
	int x = max(st[l][len] , st[r - (1 << (len)) + 1][len]);
    return x;
}
int main()
{
	while(1)
    {
        scanf("%d", &n);
        if(!n)
            return 0;
        scanf("%d" , &m);
        mp[1] = 1;
        for(int i = 1 ; i <= n ; i ++) 
        {
            scanf("%d" , &a[i]);
            if(i > 1) 
            {
                if(a[i] == a[i - 1]) 
                    mp[i] = mp[i - 1] + 1;
                else mp[i] = 1;
            }
        }
        for(int i = 1 ; i <= n ; i ++)
        {
            st[i][0] = mp[i];
        }
        find();
        while(m --)
        {
            int x , y;
            scanf("%d" , &x);
            if(x == 0)
                return 0;
            scanf("%d" , &y);
            int cnt = x;
            while(cnt <= y && a[cnt] == a[cnt - 1])
            {
                cnt ++;
            }
            printf("%d\n" , max(cnt - x , cal(cnt , y)));
        } 
    }
	return 0;
}
2024/4/9 20:02
加载中...