南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。
所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。
现在,请你写一个程序,帮小工回答南将军每次的询问吧。
注意,南将军可能询问很多次.
对于每次询问,输出第m号士兵到第n号士兵之间所有士兵杀敌数的最大值与最小值的差。
样例输入
5 2 1 2 6 9 3 1 2 2 4样例输出
1 7
分析:RMQ-ST算法模板题。
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119
代码清单:
#include<set> #include<map> #include<cmath> #include<queue> #include<stack> #include<ctime> #include<string> #include<cstdio> #include<cctype> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; const int maxn = 100010; const int max_pos = 20 ; int N,Q,l,r; int V[maxn]; int maxq[maxn][max_pos]; int minq[maxn][max_pos]; void init(){ memset(maxq,-1,sizeof(maxq)); memset(minq,0x7f,sizeof(minq)); } void input(){ scanf("%d%d",&N,&Q); for(int i=1;i<=N;i++) scanf("%d",&V[i]); } void RMQ_ST(){ int L=(int)((log(N))/(log(2.0))); for(int i=1;i<=N;i++) {maxq[i][0]=minq[i][0]=V[i];} for(int j=1;j<=L;j++){ for(int i=1;i+(1<<j)-1<=N;i++){ maxq[i][j]=max(maxq[i][j-1],maxq[i+(1<<(j-1))][j-1]); minq[i][j]=min(minq[i][j-1],minq[i+(1<<(j-1))][j-1]); } } } void solve(){ RMQ_ST(); for(int i=1;i<=Q;i++){ scanf("%d%d",&l,&r); int mi=(int)((log(r-l+1.0))/(log(2.0))); int maxnum=max(maxq[l][mi],maxq[r-(1<<mi)+1][mi]); int minnum=min(minq[l][mi],minq[r-(1<<mi)+1][mi]); printf("%d\n",maxnum-minnum); } } int main(){ init(); input(); solve(); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/47306537