P1816忠誠

這是一個區間查詢最值的問題,用線段樹來作。node

建樹的時候,這裏不是求和,應該是e[k].w=min(e[k*2].w,e[k*2+1].w),因此這裏要注意如下,其次是查詢的時候,由於本題不用讓咱們修改,因此咱們不須要懶標記,而後咱們再去區間查詢最大值c++

1.不要忘了寫build()ui

2.練好看範圍的能力spa

代碼code

#include<bits/stdc++.h>
#define maxn 100005
#define maxm 100005
#define INF 9999999
using namespace std;
int n,m;
int a,b;
struct node{
    int l,r;
    int f,w; 
}e[maxn];
int s[maxn],ans[maxn];
int minn;
inline void build(int ll,int rr,int k){
    e[k].l=ll,e[k].r =rr;
    if(ll==rr){
        e[k].w=s[ll];
        return;
    }
    int m=(e[k].l+e[k].r)/2;
    build(ll,m,k*2);
    build(m+1,rr,k*2+1);
    e[k].w=min(e[k*2].w,e[k*2+1].w);
}
inline void query(int k){
    if(e[k].l<=a&&e[k].r>=b){
        return e[k].w;
    }
    int m=(e[k].l+e[k].r)/2;
    if(a<=m) minn=min(minn,query(k*2));
    if(b>m) minn=min(minn,query(k*2+1));
    return minn;
}


int main(){
    cin>>n;
    cin>>m;
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    build(1,n,1);
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        minn=INF;        
        minn=query(1);
        ans[i]=minn;
    }
    for(int i=1;i<=m;i++){
        cout<<ans[i]<<" ";
    }
    return 0;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息