CF 482B 综合练习2

我们贪心的把这些限制填充上去,就是对每一个 \([l_i,r_i]\) 都 or 上一个 \(q_i\)

这样我们就可以保证现在的序列一定包含这些限制,而且一定为最优,因为没有添加任何“多余”的东西

然后我们再把每条限制都对这个最优的序列扫一遍,如果出现了 \([l_i,r_i]\) 的 and 和不等于 \(q_i\) ,那就可以输出 NO 了,因为这已经是最优的序列了,如果把那些不符合的 1 删掉的话一定会使序列不符合其他的一些限制。

扫完发现没有问题的话就直接输出即可

时间复杂度 \(O(m\log n)\)

// This code writed by chtholly_micromaker(MicroMaker)
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define reg register
using namespace std;
const int MaxN=100050;
struct Quetion
{
    int l,r,x;
}Q[MaxN];
template <class t> inline void read(t &s)
{
    s=0;
    reg int f=1;
    reg char c=getchar();
    while(!isdigit(c))
    {
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(isdigit(c))
        s=(s<<3)+(s<<1)+(c^48),c=getchar();
    s*=f;
    return;
}
#define lson (u<<1)
#define rson (u<<1|1)
int val[MaxN<<2],lazy[MaxN<<2];
inline void pushup(int u)
{
    val[u]=val[lson]&val[rson];
    return;
}
inline void pushdown(int u,int l,int r)
{
    if(lazy[u])
    {
        lazy[lson]|=lazy[u];
        lazy[rson]|=lazy[u];
        val[lson]|=lazy[u];
        val[rson]|=lazy[u];
        lazy[u]=0;
    }
    return;
}
inline void modify(int u,int l,int r,int ql,int qr,int k)
{
    if(ql<=l&&r<=qr)
    {
        lazy[u]|=k;
        val[u]|=k;
        return;
    }
    pushdown(u,l,r);
    reg int mid=(l+r)>>1;
    if(ql<=mid)
        modify(lson,l,mid,ql,qr,k);
    if(mid<qr)
        modify(rson,mid+1,r,ql,qr,k);
    pushup(u);
    return;
}
inline int query(int u,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)
        return val[u];
    pushdown(u,l,r);
    reg int mid=(l+r)>>1,ans=(1<<31)-1;
    if(ql<=mid)
        ans&=query(lson,l,mid,ql,qr);
    if(mid<qr)
        ans&=query(rson,mid+1,r,ql,qr);
    return ans;
}
signed main(void)
{
    int n,m;
    reg int l,r,x;
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        read(l);read(r);read(x);
        Q[i]=(Quetion){l,r,x};
        modify(1,1,n,l,r,x);
    }
    for(int i=1;i<=m;++i)
    {
        l=Q[i].l;r=Q[i].r;x=Q[i].x;
        if(query(1,1,n,l,r)!=x)
        {
            puts("NO");
            return 0;
        }
    }
    puts("YES");
    for(int i=1;i<=n;++i)
        printf("%d ",query(1,1,n,i,i));
    puts("");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/chinesepikaync/p/12516124.html
今日推荐