HDU 1806 && POJ 3368 Frequent values (RMQ)
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL long long
#define PI acos(-1.0)
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
int dp[110000][30], sum[110000], num[110000], lef[110000], righ[110000], cnt, a[110000];
void rmq()
{
int i, j;
for(i=1;i<=cnt;i++){
dp[i][0]=sum[i];
}
for(j=1;(1<<j)<=cnt;j++){
for(i=1;i<=cnt-(1<<j)+1;i++){
dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
}
}
int query(int l, int r)
{
if(l>r) return 0;
int k=0;
while((1<<k+1)<=r-l+1) k++;
return max(dp[l][k],dp[r+1-(1<<k)][k]);
}
int main()
{
int n, q, i, l, r, j;
while(scanf("%d",&n)!=EOF&&n){
scanf("%d",&q);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
cnt=1;
sum[1]=1;
num[1]=1;
lef[1]=righ[1]=1;
for(i=2;i<=n;i++){
if(a[i]!=a[i-1]){
sum[++cnt]=1;
lef[cnt]=righ[cnt]=i;
}
else{
sum[cnt]++;
righ[cnt]=i;
}
num[i]=cnt;
}
rmq();
while(q--){
scanf("%d%d",&l,&r);
if(num[l]==num[r]){
printf("%d
",r-l+1);
continue ;
}
int ll=num[l], rr=num[r];
int x=sum[ll]-l+lef[ll];
int y=sum[rr]-righ[rr]+r;
printf("%d
",max(max(x,y),query(num[righ[ll]+1],num[lef[rr]-1])));
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.