标签:ide sed hid space scan 位置 bsp pen tar
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define CLR(m,a) memset(m,a,sizeof(m)) 5 6 const int maxn=100010; 7 int val[maxn],cnt[maxn]; 8 int num[maxn],Left[maxn],Right[maxn]; 9 int n,m; 10 int sz; 11 int d[maxn][25]; 12 13 void RMQ_init(int n){ 14 for(int i=0;i<n;i++) d[i][0]=cnt[i]; 15 for(int j=1;(1<<j)<=n;j++) 16 for(int i=0;i+(1<<j)-1<n;i++){ 17 d[i][j]=max(d[i][j-1],d[i+(1<<j-1)][j-1]); 18 } 19 } 20 int RMQ(int L,int R){ 21 int k=0; 22 while(1<<(k+1)<=R-L+1) k++; 23 return max(d[L][k],d[R-(1<<k)+1][k]); 24 } 25 int main() 26 { 27 while(scanf("%d",&n)==1&&n){ 28 scanf("%d",&m); 29 sz=0; 30 int s,e; 31 CLR(cnt,0); 32 scanf("%d",&s); 33 Left[0]=0; 34 num[0]=0; 35 val[0]=s; 36 cnt[0]=1; 37 int f=0; 38 for(int i=1;i<n;i++){ 39 scanf("%d",&e); 40 if(e==s){ 41 num[i]=sz; 42 cnt[sz]++; 43 Left[i]=f; 44 }else{ 45 for(int j=f;j<i;j++) Right[j]=i-1; 46 sz++; 47 val[sz]=e; 48 cnt[sz]=1; 49 num[i]=sz; 50 Left[i]=i; 51 Right[i]=i; 52 f=i; //记录最左的位置 53 s=e; 54 } 55 } 56 RMQ_init(sz+1); 57 while(m--){ 58 int a,b; 59 scanf("%d%d",&a,&b); 60 a--;b--; 61 int ans=0; 62 if(num[a]!=num[b]){ 63 ans=max(Right[a]-a+1,b-Left[b]+1); 64 a=num[a]+1; 65 b=num[b]-1; 66 if(a<=b) ans=max(ans,RMQ(a,b)); 67 }else 68 ans=b-a+1; 69 printf("%d\n",ans); 70 } 71 } 72 return 0; 73 }
标签:ide sed hid space scan 位置 bsp pen tar
原文地址:http://www.cnblogs.com/yijiull/p/7262691.html