POJ3368-Frequent values(RMQ)
阿新 • • 發佈:2018-11-10
題目大意
給出一串數字,求指定區間L-R中出現次數最多的數的次數。
分析
用a陣列表示相同的個數。
所以,求出與l相同的個數,和從第一個不和l相同的數到r 直接求
AC Code
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e5+5; const int INF=0x3f3f3f3f; int dp[maxn][20],a[maxn],ori[maxn]; void ST(int n) { for (int i = 1; i <= n; i++) dp[i][0] = a[i]; for (int j = 1; (1 << j) <= n; j++) {//2^j for (int i = 1; i + (1 << j) - 1 <= n; i++) { dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); } } } int RMQ(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 << k) + 1][k]); } int main() { int n,q,l,r; while(~scanf("%d",&n)&&n) { scanf("%d",&q); //memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++) { scanf("%d",&ori[i]); if(ori[i]==ori[i-1]) a[i]=a[i-1]+1; else a[i]=1; } ST(n); while(q--) { scanf("%d%d",&l,&r); int t=l; while(ori[t]==ori[l]&&t<=r){ t++; } printf("%d\n",max(RMQ(t,r),t-l)); } } return 0; }