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(位运算&差分)的主要内容,如果未能解决你的问题,请参考以下文章

Interesting Array

B. Interesting drink1100 / 二分

?Good Bye 2019 B. Interesting Subarray

B. MEXor Mixup1000 / 位运算

[Codeforces 482B] Interesting Array

cf1516 B. AGAGA XOOORRR(数学+位运算)