zoukankan      html  css  js  c++  java
  • hdu 1754 I Hate It

    最开始学了线段树,然后就写了这道题,误以为所有的线段树都要用lazy标记(其实就是这样的,应该都能用lazy标记吧)

    这个题是点修改,所以我感觉用lazy标记没有什么作用,因为他的区间就是最小的了,是一个点区间,然后把lazy标记去了以后就过了(但现在还是好奇带lazy标记的应该怎么写)

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+7;
    
    int num[maxn];
    struct node
    {
        int l,r;
        int maxe;
    }tree[maxn*4];
    
    void build(int i,int l,int r)
    {
        tree[i].l=l;
        tree[i].r=r;
        if(l==r){
            tree[i].maxe=num[l];
    //        printf("test %d %d
    ",l,tree[i].maxe);
            return ;
        }
        int mid=(l+r)>>1;
        build(i<<1,l,mid);
        build(i<<1|1,mid+1,r);
        tree[i].maxe=max(tree[i<<1].maxe,tree[i<<1|1].maxe);
    }
    void update(int i,int l,int r,int val)
    {
        if(tree[i].l==l&&tree[i].r==r){
            tree[i].maxe=val;
            return ;
        }
        tree[i].maxe=max(tree[i].maxe,val);
        int mid=(tree[i].l+tree[i].r)>>1;
        if(r<=mid) update(i<<1,l,r,val);
        else if(l>mid) update(i<<1|1,l,r,val);
        else{
            update(i<<1,l,mid,val);
            update(i<<1|1,mid+1,r,val);
        }
    }
    int query(int i,int l,int r)
    {
        if(tree[i].l==l&&tree[i].r==r){
            return tree[i].maxe;
        }
        int mid=(tree[i].l+tree[i].r)>>1;
        if(r<=mid) query(i<<1,l,r);
        else if(l>mid) query(i<<1|1,l,r);
        else return max(query(i<<1,l,mid),query(i<<1|1,mid+1,r));
    }
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            memset(num,0,sizeof(num));
            for(int i=1;i<=n;i++)
                scanf("%d",&num[i]);
            build(1,1,n);
            for(int i=0;i<m;i++){
                char ch;
                cin>>ch;
                if(ch=='Q'){
                    int a,b;
                    scanf("%d%d",&a,&b);
    
                    printf("%d
    ",query(1,a,b));
                }
                else{
                    int a,b;
                    scanf("%d%d",&a,&b);
                    update(1,a,a,b);
                }
            }
        }
        return 0;
    }
    /*
    5 6
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 2 9
    Q 1 5
    
    5 6
    1 2 3 4 5
    Q 1 5
    Q 3 4
    Q 4 5
    Q 1 5
    */
  • 相关阅读:
    Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
    Android录制声音(二)录音输输出格式
    Firemacs:像垄断 Emacs 一样垄断 Firefox
    超棒的 KDE 面板小序次-Kirocker Music Display
    特征化设置你的linux环境
    软响铃 ── 把 beep 换成音乐
    简化 Picasa 图片上传
    Moonlight:Linux 平台上的 Silverlight
    Wine 0.9.39
    本钱与linux
  • 原文地址:https://www.cnblogs.com/lalalatianlalu/p/7966958.html
Copyright © 2011-2022 走看看