UVA 11235 - Requent values - RMQ (st 표) + 여정 인 코딩
이 문제 의 데이터 에서 ST 표 와 선분 수 는 모두 100 + ms 의 차이 가 크 지 않다.
    :
             a,            (i, j),  ai,ai+1...aj               。  예비 처 리 는 먼저 모든 같은 요 소 를 하나의 node 로 합 치 는 것 입 니 다. node 는 이 요소 번호 + 이 요소 개 수 를 포함 합 니 다. (표 2 라 고 함)
그리고 위치 기록 i 에 대응 하 는 것 은 예비 처리 후의 i 번 째 node 입 니 다.
매번 조회 (a, b)
a, b 위치 만 대응 해 야 합 니 다. 표 2 의 번호 사이 의 모든 node 는 이 node 의 요소 갯 수 에 대해 RMQ 를 구하 고 tmp 1 로 기록 합 니 다.
그리고 a 에 대응 하 는 node 의 오른쪽 점 - a + 1 ,tmp 2 (즉, 원소 값 이 a 인 계산 가능 한 개수)
같은 이치 대응 하 는 node b - 왼쪽 점 + 1, tmp 3 로 기록 (즉, 원소 값 이 b 인 계산 가능 한 개수)
삼자 가 최대 를 취하 면 된다
특수 한 경우 a, b 에 대응 하 는 node 가 같은 경우 b - a + 1 만 출력 하면 됩 니 다.
 
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std; 
#include <iostream>
using namespace std; 
const int maxn=100005;
int ok;//ok      
 
 int value [maxn],cun[maxn];// i   ,       
 int l[maxn],r[maxn];// i                
 int who[maxn];//        i    
 int tm[maxn]; //    
 int mx[maxn][16];//16 logn   ,st 
 
int max(int a,int b)
{
	if (a<b)
	return b;
	return a;
}  
 void rmq_init()
 {
     int i,j;
     for(j=1;j<=ok;j++) mx[j][0]=cun[j];
     int m=floor(log((double)ok)/log(2.0));
     for(i=1;i<=m;i++){
         for(j=ok;j>0;j--){
             mx[j][i]=mx[j][i-1];
             if(j+(1<<(i-1))<=ok) mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
         }
    }
   
 }
 
 int rmq_max(int l,int r)
 {
     int m=floor(log((double)(r-l+1))/log(2.0));
    int a=max(mx[l][m],mx[r-(1<<m)+1][m]); 
    return a;   //a    
 } 
int main()
{ 
    int  t;
	int  n,m; 
	while (cin>>n)
	{
	
		if (!n) break;
				
		scanf("%d",&m); 
		memset(mx,0,sizeof(mx));
		int  i;
		for(  i = 1; i <= n; i++)
		{
			scanf("%d",&tm[i]); 
		} 
		 ok=0;
			for(  i = 1; i <= n; i++)
		{
			value[++ok]=tm[i];
			cun[ok]=1;
			who[i]=ok;
			l[ok]=i;
			while(tm[i+1]==tm[i])
			{
			
				cun[ok]++;
				i++;
				who[i]=ok;
			} 	
			r[ok]=i;
		} 
		rmq_init(); 
		int a,b;
	 	for(  i = 1; i <= m; i++)
		{
			scanf("%d%d",&a,&b); 
			int t1=who[a];  //t a        
			int t2=who[b];
			int tmp1=0;
			if (t2>t1+1)	//      1                  ,   0
				 tmp1=rmq_max(t1+1,t2-1); 
			int tmp2=r[t1]-a+1;//a      
			int tmp3=b-l[t2]+1;
			if (t2==t1)		//  a,b     ,     ,  b-a+1
			printf("%d
",b-a+1);
		else
			printf("%d
",max(tmp1,max(tmp2,tmp3)));
		} 
			
			
	}   
    
    
    return 0;
}
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.