就是裸RMQ啊。。
求区间最大值和区间最小值,一看就像RMQ,当然线段树貌似也可以。
至于算法嘛。自己学~(好吧,放个传送门。。。)
然后就是最后把maxsum-minsum就好啦233~
时间效率:预处理O(N)查找O(1)
是不是很快~
下面贴代码
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int n,q; int a,b; int maxsum,minsum; int maxn[50001][20]; int num[50001]; int minn[50001][20]; void RMQ(int s) { for(int j=1;j<=19;j++) for(int i=1;i<=n;i++){ if(i+(1<<j)-1<=n) { maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]); minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]); } } } int main(){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); maxn[i][0]=minn[i][0]=num[i]; } RMQ(n); for(int i=1;i<=q;i++) { scanf("%d%d",&a,&b); int k=(int)(log(b-a+1.0)/log(2.0)); maxsum=max(maxn[a][k],maxn[b-(1<<k)+1][k]); minsum=min(minn[a][k],minn[b-(1<<k)+1][k]); printf("%d\n",maxsum-minsum); } }
时间: 2024-10-08 01:00:51