标签:git ++i make sig 填充 down pre 添加 综合
我们贪心的把这些限制填充上去,就是对每一个 \([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;
}
标签:git ++i make sig 填充 down pre 添加 综合
原文地址:https://www.cnblogs.com/chinesepikaync/p/12516124.html