前言:这个题目可以怎么写呢,可以用st表优化查询速度,我们把 l 和 r 分成两部分,左边的暴力求出,右边的直接查表
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N][20]; // 稀疏表
int b[N]; // 存储输入数组
int dp[N]; // 存储每个位置的连续段长度
int n, q; // 数组大小和查询次数
void ini() {
for(int i = 1; i <= n; i++) {
a[i][0] = dp[i];
}
int t = log2(n);
for(int len = 1; len <= t; len++) {
for(int i = 1; i + (1 << len) - 1 <= n; i++) {
a[i][len] = max(a[i][len-1], a[i + (1 << (len-1))][len-1]);
}
}
}
int query(int l, int r) {
if(l > r) return 0;
int len = log2(r - l + 1);
return max(a[l][len], a[r - (1 << len) + 1][len]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
while(true) {
cin >> n;
if(n == 0) break;
cin >> q;
for(int i = 1; i <= n; i++) {
cin >> b[i];
}
dp[1] = 1;
for(int i = 2; i <= n; i++) {
if(b[i] == b[i-1]) dp[i] = dp[i-1] + 1;
else dp[i] = 1;
}
ini();
while(q--) {
int l, r;
cin >> l >> r;
if(b[l] == b[r]) {
cout << (r - l + 1) << "\n";
} else {
int cntLeft = 1;
int j = l + 1;
while(j <= r && b[j] == b[j-1]) {
cntLeft++;
j++;
}
int cntRight = r - j + 1;
int u = query(j, r);
cout << max({cntLeft, u}) << endl;
}
}
}
return 0;
}