• Codefoeces-482 B. Interesting Array


    传送门

    题意:构造一个长度为n的序列 满足m次询问 询问的内容是区间L->R &的值为W

    思路:我们对于每个询问 先直接让它满足条件 及 sum[rt]|W 然后push_up更新下 区间 &的值 

    更新完所有询问后 我们再回头check 看对于每个询问是否能再次满足

    挺简单的 但是训练赛写这道题的时候 平时都是宏定义了lson 和 rson 然后今天写这道题的时候 递归左右区间 rt没有写<<1和rt<<1|1 呜呜呜 白wa了4次

    #include <bits/stdc++.h>
    #define ll long long
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    const int maxn = 100005;
    int sum[maxn<<2],lazy[maxn<<2];
    void push_up(int rt){
        sum[rt]=sum[rt<<1]&sum[rt<<1|1];
    }
    void push_down(int rt){
        if(lazy[rt]){
            lazy[rt<<1]|=lazy[rt];
            lazy[rt<<1|1]|=lazy[rt];
            sum[rt<<1]|=lazy[rt];
            sum[rt<<1|1]|=lazy[rt];
            lazy[rt]=0;
        }
    }
    void update(int l,int r,int rt,int L,int R,int val){
        if(L<=l&&r<=R){
            sum[rt]|=val;
            lazy[rt]|=val;
            return ;
        }
        push_down(rt);
        int m=(l+r)>>1;
        if(L<=m) update(lson,L,R,val);
        if(R>m)  update(rson,L,R,val);
        push_up(rt);
    }
    int fg;
    void query(int l,int r,int rt,int L,int R){
        if(L<=l&&r<=R){
            fg&=sum[rt];
            return ;
        }
        push_down(rt);
        int m=(l+r)>>1;
        if(L<=m) query(lson,L,R);
        if(R>m)  query(rson,L,R);
        push_up(rt);
    }
    int u[maxn],v[maxn],w[maxn];
    void go(int l,int r,int rt,int L,int R){
        if(l==r){
            cout<<sum[rt]<<" ";
            return ;
        }
        push_down(rt);
        int m=(l+r)>>1;
        go(lson,L,R);
        go(rson,L,R);
    }
    int main(){
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d %d %d",&u[i],&v[i],&w[i]);
            update(1,n,1,u[i],v[i],w[i]);
        }
        for(int i=1;i<=m;i++){
            fg=(1<<30)-1;
            query(1,n,1,u[i],v[i]);
            if(fg!=w[i]){
                puts("NO");
                return 0;
            }
        }
        puts("YES");
        go(1,n,1,1,n);
        return 0;
    }
    View Code
  • 相关阅读:
    JVM结构
    redis缓存淘汰策略
    idea常用快捷键
    Spring常用注解
    redis持久化
    crontab定时调度
    redis五种数据类型
    LVM实验报告
    fdisk以及parted分区实验
    fdisk与parted的区别以及parted为何可分128个区
  • 原文地址:https://www.cnblogs.com/MengX/p/11343804.html
Copyright © 2020-2023  润新知