从-114514开始的数据结构学习

【[USACO04OPEN]MooFest】

树状数组好题

https://zyqnb.blog.luogu.org/solution-p5094

 

Zyq于2020/8/3学会了线段树

P1531 I Hate It

 

没啥好玩的,就是一朴素的线段树维护区间最值。

#include
#define int long long
using namespace std;
const int maxn=1919810;
struct Node{
    int L,R,sum;
}tree[maxn];
int input[maxn],n,m;
inline int read()        
{        
    int s = 0, f = 1;        
    char ch = getchar();        
    while(!isdigit(ch)) {        
        if(ch == '-') f = -1;        
        ch = getchar();        
    }        
    while(isdigit(ch)) {        
        s = s * 10 + ch - '0';        
        ch = getchar();        
    }        
    return s * f;        
}
inline void build(int i,int l,int r){
    tree[i].L=l;
    tree[i].R=r;
    if(l==r){
        tree[i].sum=input[l];
        return;
    }
    int mid=(l+r)>>1;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    tree[i].sum=max(tree[i*2].sum,tree[i*2+1].sum);
}
inline int query(int i,int l,int r){
    if(tree[i].L>=l&&tree[i].R<=r)
    return tree[i].sum;
    if(tree[i].Rr)
    return 0;
    int ans=0;
    if(tree[i*2].R>=l)
    ans=ans=max(ans,query(2*i,l,r));
    if(tree[i*2+1].L<=r)
    ans=max(ans,query(2*i+1,l,r));
    return ans;
}
inline void update(int i,int dis,int k){
    if(tree[i].L==tree[i].R){
        tree[i].sum=max(tree[i].sum,k);
        return ;
    }
    if(dis<=tree[i*2].R)
    update(i*2,dis,k);
    else
    update(i*2+1,dis,k);
    tree[i].sum=max(tree[i*2].sum,tree[i*2+1].sum);
}
signed main(){
    n=read();
    m=read();
    for(int i=1;i<=n;i++)
    cin>>input[i];
    build(1,1,n);
    while(m--){
        char opt;
        int x,y,k;
        cin>>opt;
        if(opt=='U'){
            x=read();
            k=read();
            update(1,x,k);
        }
        else{
            x=read();
            y=read();
            cout<1,x,y)<<endl;
        }
    }
}   

 

你可能感兴趣的:(从-114514开始的数据结构学习)