B. Interesting Array(位运算&差分)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B. Interesting Array(位运算&差分)相关的知识,希望对你有一定的参考价值。
B. Interesting Array(位运算&差分)
对于所有询问,我们按位来考虑和赋值,显然利用差分进行区间修改,然后前缀和,则 d [ i ] > 0 d[i]>0 d[i]>0的地方该位都是 1 1 1,判无解的话,就是如果某个询问该位为0,但是该区间都是1,则无解。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
学到了一个牛逼操作。
如果将一个数若非0则赋值为1,否则赋值为0.
x = ! ! x x=!!x x=!!x 即可。
! x !x !x 则将非0数赋值为0,0赋值为1.
在来一次就是非0数赋值为1,0赋值为0了。
// Problem: B. Interesting Array
// Contest: Codeforces - Codeforces Round #275 (Div. 1)
// URL: https://codeforces.ml/problemset/problem/482/B
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// Date: 2021-08-04 10:36:53
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
int n,m;
struct query{
int l,r,q;
}a[N];
int b[N],d[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].q);
for(int i=0;i<30;i++){
for(int j=1;j<=n;j++) d[j]=0;
for(int j=1;j<=m;j++) if(a[j].q>>i&1) d[a[j].l]++,d[a[j].r+1]--;
for(int j=1;j<=n;j++) d[j]+=d[j-1];
for(int j=1;j<=n;j++) d[j]=!!d[j],b[j]|=d[j]<<i;
for(int j=1;j<=n;j++) d[j]+=d[j-1];
for(int j=1;j<=m;j++){
if(!(a[j].q>>i&1)&&(d[a[j].r]-d[a[j].l-1]==a[j].r-a[j].l+1)){
return puts("NO"),0;
}
}
}
puts("YES");for(int i=1;i<=n;i++) printf("%d ",b[i]);printf("\\n");
return 0;
}
以上是关于B. Interesting Array(位运算&差分)的主要内容,如果未能解决你的问题,请参考以下文章
?Good Bye 2019 B. Interesting Subarray