【POJ3264】Balanced Lineup(RMQ)
题意:每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John
决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛.
但是为了避免水平悬殊,牛的身高不应该相差太大.
John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <=
身高 <= 1,000,000). 他想知道每一组里面最高和最低的牛的身高差别.
注意: 在最大数据上, 输入和输出将占用大部分运行时间.
思路:裸RMQ
1 #include<map> 2 #include<set> 3 #include<cmath> 4 #include<cstdio> 5 #include<vector> 6 #include<cstring> 7 #include<cstdlib> 8 #include<iostream> 9 #include<algorithm> 10 #define MAXN 210000 11 using namespace std; 12 int f[MAXN][17],g[MAXN][17]; 13 int a[MAXN]; 14 int n,m,x,y; 15 int main() 16 { 17 freopen("poj3264.in","r",stdin); 18 freopen("poj3264.out","w",stdout); 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 21 for(int i=1;i<=n;i++) f[i][0]=g[i][0]=a[i]; 22 23 int len=log(n)/log(2); 24 for(int i=1;i<=len;i++) 25 for(int j=1;j+(1<<i)-1<=n;j++) 26 { 27 f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]); 28 g[j][i]=min(g[j][i-1],g[j+(1<<(i-1))][i-1]); 29 } 30 for(int i=1;i<=m;i++) 31 { 32 scanf("%d%d",&x,&y); 33 int len=y-x+1; int l=log(len)/log(2); 34 int s1=max(f[x][l],f[y-(1<<l)+1][l]); 35 int s2=min(g[x][l],g[y-(1<<l)+1][l]); 36 printf("%d\n",s1-s2); 37 } 38 return 0; 39 }
null