玲珑杯1128--线段树模板

来源:互联网 发布:java iterator() 编辑:程序博客网 时间:2024/06/06 02:36

保存一波线段树模板,之前写的都没了,干脆再写一次。。

#include <iostream>#include <stdio.h>#include <string.h>#define siz 100005#define lson(x) ((x)<<1)#define rson(x) (((x)<<1)|1)using namespace std;struct node{    int mx,mi;};int p[siz],A[siz],B[siz];node S[siz<<2];int n;void build(int root,int left,int right){    if(left==right){        S[root].mi=S[root].mx=A[left];        return ;    }    int mid=(left+right)>>1;    build(lson(root),left,mid);    build(rson(root),mid+1,right);    S[root].mx=max(S[lson(root)].mx,S[rson(root)].mx);    S[root].mi=min(S[lson(root)].mi,S[rson(root)].mi);}int query1(int root,int left,int right,int l,int r){    if(left==l&&right==r){        return S[root].mx;    }    int mid=(left+right)>>1;    if(r<=mid){        return query1(lson(root),left,mid,l,r);    }    else if(l>=mid+1){        return query1(rson(root),mid+1,right,l,r);    }    else{        return max(query1(lson(root),left,mid,l,mid),query1(rson(root),mid+1,right,mid+1,r));    }}int query2(int root,int left,int right,int l,int r){    if(left==l&&right==r){        return S[root].mi;    }    int mid=(left+right)>>1;    if(r<=mid){        return query2(lson(root),left,mid,l,r);    }    else if(l>=mid+1){        return query2(rson(root),mid+1,right,l,r);    }    else{        return min(query2(lson(root),left,mid,l,mid),query2(rson(root),mid+1,right,mid+1,r));    }}void solve(){    build(1,1,n);    for(int i=1;i<=n;i++){        int maxx=query1(1,1,n,i-B[i]+1,i);        int minn=query2(1,1,n,i-B[i]+1,i);        //cout<<maxx<<" "<<minn<<endl;        //cout<<(long long)(maxx*minn)<<endl;        long long int ans=maxx;        ans=ans*minn;        printf("%lld\n",(long long)maxx*minn);    }}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++){        scanf("%d",&A[i]);    }    for(int i=1;i<=n;i++){         scanf("%d",&B[i]);    }    solve();    return 0;}


原创粉丝点击