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; }