• 题意
    • 输出区间最大值与最小值的差
  • 题解
    • 线段树的区间查询或者直接上ST即可
    • 注意ST初始化f数组要看数据范围
  • 线段树代码:
  • #include<algorithm>
    #include <iostream>
    #include   <fstream>
    #include  <cstdlib>
    #include  <cstring>
    #include  <cassert>
    #include   <cstdio>
    #include   <vector>
    #include   <string>
    #include    <cmath>
    #include    <queue>
    #include    <stack>
    #include      <set>
    #include      <map>
    using namespace std;
    #define P(a,b,c) make_pair(a,make_pair(b,c))
    #define rep(i,a,n) for (int i=a;i<=n;i++)
    #define per(i,a,n) for (int i=n;i>=a;i--)
    #define CLR(vis) memset(vis,0,sizeof(vis))
    #define MST(vis,pos) memset(vis,pos,sizeof(vis))
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef pair<int,pair<int,int> >pii;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod = 1000000007;
    const int INF = 0x3f3f3f3f;
    ll gcd(ll a, ll b) {
    	return b ? gcd(b, a%b) : a;
    }
    template<class T>inline void gmax(T &A, T B) {
    	(A<B)&&(A=B);//if(B>A)A=B;
    }
    template<class T>inline void gmin(T &A, T B) {
    	(A>B)&&(A=B);//if(B<A)A=B;
    }
    template <class T>
    inline bool scan(T &ret) {
    	char c;
    	int sgn;
    	if(c=getchar(),c==EOF) return 0; //EOF
    	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    	sgn=(c=='-')?-1:1;
    	ret=(c=='-')?0:(c-'0');
    	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    	ret*=sgn;
    	return 1;
    }
    inline void outt(int x) {
    	if(x>9) outt(x/10);
    	putchar(x%10+'0');
    }
    const int maxn=1e6+10;
    int a[maxn];
    struct SegmentTree {
    	int l,r;
    	int dat;
    	int mi;
    } t[maxn * 4];
    void build(int p,int l,int r) { //build(1,1,n) 1为根节点
    	t[p].l=l,t[p].r=r;
    	if(l==r) {
    		t[p].dat=a[l];
    		t[p].mi=a[l];
    		return;
    	}
    	int mid=(l+r)/2;
    	build(p*2,l,mid);
    	build(p*2+1,mid+1,r);
    	t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
    	t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
    }
    void change(int p,int x,int v) { //change(1,x,v) 1为根节点
    	if(t[p].l==t[p].r) {
    		t[p].dat=v;
    		t[p].mi=v;
    		return ;
    	}
    	int mid=(t[p].l+t[p].r)/2;
    	if(x<=mid)change(p*2,x,v);
    	else change(p*2+1,x,v);
    	t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
    	t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
    }
    int ask_max(int p,int l,int r) { //ask(1,l,r) 1为根节点
    	if(l<=t[p].l && r>=t[p].r)return t[p].dat;
    	int mid=(t[p].l + t[p].r)/2;
    	int val=-(1<<30);
    	if(l<=mid)val=max(val,ask_max(p*2,l,r));
    	if(r>mid) val=max(val,ask_max(p*2+1,l,r));
    	return val;
    }
    int ask_min(int p,int l,int r) { //ask(1,l,r) 1为根节点
    	if(l<=t[p].l && r>=t[p].r)return t[p].mi;
    	int mid=(t[p].l + t[p].r)/2;
    	int val=1<<30;
    	if(l<=mid)val=min(val,ask_min(p*2,l,r));
    	if(r>mid) val=min(val,ask_min(p*2+1,l,r));
    	return val;
    }
    string cmd;
    int main() {
    	int m,n;
    	while(scan(n)) {
    		scan(m);
    		rep(i,1,n)scan(a[i]);
    		build(1,1,n);
    		while(m--) {
    			int x,y;
    			scan(x);
    			scan(y);
    				printf("%d\n", ask_max(1,x,y)-ask_min(1,x,y));
    		}
    	}
    	return 0;
    }
    
  • ST代码
  • #include<algorithm>
    #include <iostream>
    #include  <fstream>
    #include  <cstdlib>
    #include  <cstring>
    #include  <cassert>
    #include   <cstdio>
    #include   <vector>
    #include   <string>
    #include    <cmath>
    #include    <queue>
    #include    <stack>
    #include      <set>
    #include      <map>
    using namespace std;
    #define P(a,b,c) make_pair(a,make_pair(b,c))
    #define rep(i,a,n) for (int i=a;i<=n;i++)
    #define per(i,a,n) for (int i=n;i>=a;i--)
    #define CLR(vis) memset(vis,0,sizeof(vis))
    #define MST(vis,pos) memset(vis,pos,sizeof(vis))
    #define pb push_back
    #define mp make_pair
    #define all(x) (x).begin(),(x).end()
    #define fi first
    #define se second
    #define SZ(x) ((int)(x).size())
    typedef pair<int,pair<int,int> >pii;
    typedef long long ll;
    typedef unsigned long long ull;
    const ll mod = 1000000007;
    const int INF = 0x3f3f3f3f;
    ll gcd(ll a, ll b) {
    	return b ? gcd(b, a%b) : a;
    }
    template<class T>inline void gmax(T &A, T B) {
    	(A<B)&&(A=B);//if(B>A)A=B;
    }
    template<class T>inline void gmin(T &A, T B) {
    	(A>B)&&(A=B);//if(B<A)A=B;
    }
    template <class T>
    inline bool scan(T &ret) {
    	char c;
    	int sgn;
    	if(c=getchar(),c==EOF) return 0; //EOF
    	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    	sgn=(c=='-')?-1:1;
    	ret=(c=='-')?0:(c-'0');
    	while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    	ret*=sgn;
    	return 1;
    }
    inline void outt(int x) {
    	if(x>9) outt(x/10);
    	putchar(x%10+'0');
    }
    const int maxn=1e5+10;
    int f[2*maxn][32];
    int f2[2*maxn][32];
    int a[maxn];
    int n;
    //void ST_prework(){
    //	rep(i,1,n)f1[i][0]=a[i],f2[i][0]=a[i];
    //	int t=log(n)/log(2)+1;
    //	rep(j,1,t-1){
    //		rep(i,1,n-(1<<j)+1){
    //			f1[i][j]=max(f1[i][j-1],f1[i+(i<<(j-1))][j-1]);
    //			f2[i][j]=min(f2[i][j-1],f2[i+(i<<(j-1))][j-1]);
    //		}
    //	}
    //}
    //int ST_query(int l,int r){
    //	int k = log(r-l+1)/log(2);
    //	cout<< max(f1[l][k],f1[r-(1<<k)+1][k]) << " " << min(f2[l][k],f2[r-(1<<k)+1][k]) << endl;
    //	return max(f1[l][k],f1[r-(1<<k)+1][k])-min(f2[l][k],f2[r-(1<<k)+1][k]);
    //}
    //
    void ST_prework()
    {
        for(int i=1;i<=n;i++)f[i][0]=a[i],f2[i][0]=a[i];
        int t=log(n)/log(2)+1;
        for(int j=1;j<t;j++)
            for(int i=1;i<=n-(1<<j)+1;i++){
            	f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
                f2[i][j]=min(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
    		}
                
    }
    int ST_query(int l,int r)
    {
        int k=log(r-l+1)/log(2);
        return max(f[l][k],f[r-(1<<k)+1][k])-min(f2[l][k],f2[r-(1<<k)+1][k]);
    }
     
    int main() {
    	int m;
    	while(scan(n)) {
    		scan(m);
    //		memset(a,0x3f,sizeof(f2));
    		rep(i,1,n){
    			rep(j,1,30){
    				f2[i][j]=0x3f3f3f3f;
    			}
    		}
    		rep(i,1,n)scan(a[i]);
    		ST_prework();
    		while(m--) {
    			int x,y;
    			scan(x);
    			scan(y);
    			printf("%d\n", ST_query(x,y));
    		}
    	}
    	return 0;
    }
    

发表评论

邮箱地址不会被公开。 必填项已用*标注