• P1816忠诚


    这是一个区间查询最值的问题,用线段树来做。

    建树的时候,这里不是求和,应该是e[k].w=min(e[k*2].w,e[k*2+1].w),所以这里要注意以下,其次是查询的时候,因为本题不用让我们修改,所以我们不需要懒标记,然后我们再去区间查询最大值

    1.不要忘了写build()

    2.练好看范围的能力

    代码

    #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;
    }
  • 相关阅读:
    Luogu-P2295 MICE
    Luogu-P2627 修剪草坪
    Loj-10176-最大连续和
    Luogu-P1886 滑动窗口
    Luogu-P3807 【模板】卢卡斯定理
    Luogu-P1879 [USACO06NOV]玉米田Corn Fields
    Luogu-P1896 [SCOI2005]互不侵犯
    Loj-SGU 223-国王
    Luogu-P2657 [SCOI2009]windy数
    素数
  • 原文地址:https://www.cnblogs.com/china-mjr/p/11745125.html
Copyright © 2020-2023  润新知