P3760 [TJOI2017]异或和(BIT&位运算)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3760 [TJOI2017]异或和(BIT&位运算)相关的知识,希望对你有一定的参考价值。

P3760 [TJOI2017]异或和(BIT&位运算)

考虑对按位计算贡献。

∑ k = 0 2 k ≤ s n 2 k × ( ∑ i = 1 n ∑ j = 0 i − 1 ( s i − s j ) > > k & 1 ) \\large \\sum\\limits_{k=0}^{2^k\\le s_n}2^k\\times(\\sum\\limits_{i=1}^n \\sum\\limits_{j=0}^{i-1}(s_i-s_j)>> k \\&1) k=02ksn2k×(i=1nj=0i1(sisj)>>k&1)

考虑 优化第三维 j j j

s i s_i si的第 k k k位为 1 1 1时,

s j s_j sj的第 k k k位0且从第 0 0 0位到 k − 1 k-1 k1位的数小于等于 s i s_i si的才会变化。

s j s_j sj的第 k k k位1且从第 0 0 0位到 k − 1 k-1 k1位的数大于 s i s_i si​的才会变化。

因此可以用两个 B I T BIT BIT维护 0 , 1 0,1 0,1

s i s_i si的第 k k k位为0同理。

同时用 b [ i ] b[i] b[i]数组维护当前 s i s_i si 0 0 0 k − 1 k-1 k1位的值,这样便于比较。

// Problem: P3760 [TJOI2017]异或和
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3760
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-07-26 20:32:39
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e5+5,M=1e6+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]); 
}
struct BIT{
	#define lowbit(x) x&(-x)
	#define il inline
	ll s[M][2];
	int n;
	il void upd(int x,int y){
		while(x<=n){
			s[x][y]++;x+=lowbit(x);
		}return;
	}
	il ll que(int x,int y){
		ll ans=0;
		while(x){
			ans+=s[x][y];x-=lowbit(x);
		}return ans;
	}
}T;
int n;
int a[N],b[N],s,mx;
int main(){
	T.n=M-1;
	scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]+=a[i-1];
	while((1<<mx)<=a[n]) mx++;mx--;
	for(int i=0;i<=mx;i++){
		mst(T.s,0);
		T.upd(1,0);
		int c=0;
		for(int j=1;j<=n;j++){
			bool x=a[j]>>i&1;
			ll t=T.que(b[j]+1,x^1)+T.que(M-1,x)-T.que(b[j]+1,x);
			T.upd(b[j]+1,x);
			if(x) b[j]|=1<<i;
			if(t&1) c^=1;
		}
		if(c) s|=1<<i;
	}
	printf("%d\\n",s);
	return 0;
}

以上是关于P3760 [TJOI2017]异或和(BIT&位运算)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P3760:[TJOI2017]异或和

bzoj4888: [Tjoi2017]异或和 BIT-乱搞

Tjoi 2017 异或和

[TJOI 2017]异或和

[TJOI2017]异或和

BZOJ 4888 [Tjoi2017]异或和