Interesting Array CodeForces - 483D

点击打开链接

要求一个区间内的数相与等于一个值 那就是说这个值的某个二进制位如果是1 那这个区间内所有数对应为都要是1 即对区间内每一个数都做或运算 线段树维护一下 如果是0 那这个区间内所有数对应为至少有一个0 不用管

q次都更新完以后 再统一把每个区间都查询一下 看是否和一开始给定的值一样 不一样则说明有矛盾

#include <bits/stdc++.h>
using namespace std;

struct node1
{
    int l;
    int r;
    int val;
    int laz;
};

struct node2
{
    int l;
    int r;
    int val;
};

node1 tree[400010];
node2 order[100010];
int n,q;

void build(int l,int r,int cur)
{
    int m;
    tree[cur].l=l;
    tree[cur].r=r;
    tree[cur].val=0;
    tree[cur].laz=0;
    if(l==r) return;
    m=(l+r)/2;
    build(l,m,2*cur);
    build(m+1,r,2*cur+1);
}

void pushup(int cur)
{
    tree[cur].val=tree[2*cur].val&tree[2*cur+1].val;
}

void pushdown(int cur)
{
    if(tree[cur].laz)
    {
        tree[2*cur].val|=tree[cur].laz;
        tree[2*cur].laz|=tree[cur].laz;
        tree[2*cur+1].val|=tree[cur].laz;
        tree[2*cur+1].laz|=tree[cur].laz;
        tree[cur].laz=0;
    }
}

void update(int pl,int pr,int val,int cur)
{
    if(pl<=tree[cur].l&&tree[cur].r<=pr)
    {
        tree[cur].val|=val;
        tree[cur].laz|=val;
        return;
    }
    pushdown(cur);
    if(pl<=tree[2*cur].r) update(pl,pr,val,2*cur);
    if(pr>=tree[2*cur+1].l) update(pl,pr,val,2*cur+1);
    pushup(cur);
}

int query(int pl,int pr,int cur)
{
    int res;
    if(pl<=tree[cur].l&&tree[cur].r<=pr)
    {
        return tree[cur].val;
    }
    pushdown(cur);
    res=1073741823;
    if(pl<=tree[2*cur].r) res&=query(pl,pr,2*cur);
    if(pr>=tree[2*cur+1].l) res&=query(pl,pr,2*cur+1);
    return res;
}

int main()
{
    int i,l,r,val,flag;
    scanf("%d%d",&n,&q);
    build(1,n,1);
    for(i=1;i<=q;i++)
    {
        scanf("%d%d%d",&order[i].l,&order[i].r,&order[i].val);
        update(order[i].l,order[i].r,order[i].val,1);
    }
    flag=1;
    for(i=1;i<=q;i++)
    {
        if(query(order[i].l,order[i].r,1)!=order[i].val)
        {
            flag=0;
            break;
        }
    }
    if(flag)
    {
        printf("YES\n");
        for(i=1;i<=n;i++)
        {
            printf("%d ",query(i,i,1));
        }
        printf("\n");
    }
    else printf("NO\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/81053396
今日推荐