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
原文地址:https://www.cnblogs.com/MengX/p/11343804.html