標籤:
題意:給出n個數和Q個詢問(l,r),對於每個詢問求出(l,r)之間連續出現次數最多的次數。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 100000000710 const int INF=0x3f3f3f3f;11 const double eps=1e-5;12 typedef long long ll;13 #define cl(a) memset(a,0,sizeof(a))14 #define ts printf("*****\n");15 int n,m,tt;16 const int MAXN = 100005;17 int dp[MAXN][20];18 int mm[MAXN];19 //初始化RMQ, b數組下標從1開始,從0開始簡單修改20 void initRMQ(int n,int b[])21 {22 mm[0] = -1;23 for(int i = 1; i <= n;i++)24 {25 mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1];26 dp[i][0] = b[i];27 }28 for(int j = 1; j <= mm[n];j++)29 for(int i = 1;i + (1<<j) -1 <= n;i++)30 dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);31 }32 //查詢最大值33 int rmq(int x,int y)34 {35 int k = mm[y-x+1];36 return max(dp[x][k],dp[y-(1<<k)+1][k]);37 }38 int a[MAXN],f[MAXN];39 int main()40 {41 int i,j,k;42 #ifndef ONLINE_JUDGE43 freopen("1.in","r",stdin);44 #endif45 while(scanf("%d",&n)!=EOF)46 {47 if(n==0) break;48 scanf("%d",&m);49 for(i=1;i<=n;i++)50 {51 scanf("%d",&a[i]);52 f[1]=1;53 if(i!=1)54 {55 if(a[i]==a[i-1])56 {57 f[i]=f[i-1]+1;58 }59 else60 f[i]=1;61 }62 }63 /*for(i=1;i<=n;i++)64 {65 printf("%d ",f[i]);66 }67 printf("\n");*/68 initRMQ(n,f);69 while(m--)70 {71 int uu,v;72 scanf("%d%d",&uu,&v);73 int u=uu;74 while(u<=v&&a[u]==a[u-1])75 {76 u++;77 }78 int ans=rmq(u,v);79 ans=max(u-uu,ans);80 printf("%d\n",ans);81 }82 }83 }
poj 3368 rmq ***