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=0∑2k≤sn2k×(i=1∑nj=0∑i−1(si−sj)>>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 k−1位的数小于等于 s i s_i si的才会变化。
s j s_j sj的第 k k k位1且从第 0 0 0位到 k − 1 k-1 k−1位的数大于 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 k−1位的值,这样便于比较。
// 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&位运算)的主要内容,如果未能解决你的问题,请参考以下文章