[洛谷]P1440 求m区间内的最小值(线段树)

板子题~

ACcode:

#include
using namespace std;
const int N = 2e6+10;
typedef long long ll;
#define int long long
struct node{
    int l,r;
    int minv;
}tr[N*4];
int n,m,w[N];
void pushup(int u){
    tr[u].minv=min(tr[u<<1].minv,tr[u<<1|1].minv);
}
void build(int u,int l,int r){
    if(l==r)tr[u]={l,r,w[l]};
    else{
        tr[u]={l,r};
        int mid=l+r>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
int query(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r)return tr[u].minv;
    int mid=tr[u].l+tr[u].r>>1;
    ll minv=1<<30;
    if(l<=mid)minv=query(u<<1,l,r);
    if(r>mid)minv=min(minv,query(u<<1|1,l,r));
    pushup(u);
    return minv;
}
signed main(){
   ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>w[i];
    build(1,1,n);
    cout<<0<<'\n';
    for(int i=2;i<=n;i++){
        int a=i-m;
        if(a<1)a=1;
        cout << query(1,a,i-1)<<"\n";
    }
    return 0;
}

over~

你可能感兴趣的:(算法,c++,数据结构,树状数组,线段树)