码迷,mamicode.com
首页 > 编程语言 > 详细

[luogu3760 TJOI2017] 异或和(树状数组)

时间:2018-10-18 01:08:49      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:else   new   char   ring   const   return   cst   name   odi   

传送门

Solution

一位一位考虑,直接得到答案中第i为是否为1

Code

//By Menteur_Hxy
#include <ctime>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Re register
#define Ms(a,b) memset(a,(b),sizeof(a))
#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
#define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)
#define Lof(i,a,b) for(Re int i=(a),_=(b);i<=_;i+=i&-i)
#define Lor(i,a) for(Re int i=(a);i;i-=i&-i)
using namespace std;
typedef long long LL;

inline int read() {
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    return x*f;
}

const int N=1e6+10;
int n,m;
LL ans;
LL a[N],s[N],b[N];

struct BIT{
    int da[2][N];
    void clear() {Ms(da,0);}
    void Modify(int x,int k) {Lof(i,x,m)da[k][i]++;}
    LL query(int x,int k) {LL t=0;Lor(i,x)t+=da[k][i];return t;}
}B;

int main() {
    n=read(); Fo(i,1,n) a[i]=read(),s[i]=s[i-1]+a[i]; m=s[n];
    Fo(i,0,20) {
        if((1ll<<i)>m) break; 
        bool cnt=0; B.clear(); B.Modify(1,0);
        Fo(j,1,n) {
            LL o=s[j]&(1ll<<i),tmp=0;
            if(o) tmp=B.query(b[j]+1,0)+B.query(m,1)-B.query(b[j]+1,1);
            else tmp=B.query(b[j]+1,1)+B.query(m,0)-B.query(b[j]+1,0);
            if(tmp&1) cnt^=1;  B.Modify(b[j]+1,(o>0)); b[j]|=o;
        } 
        if(cnt) ans|=(1ll<<i);
    }
    printf("%lld",ans);
    return 0;
}

[luogu3760 TJOI2017] 异或和(树状数组)

标签:else   new   char   ring   const   return   cst   name   odi   

原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9807624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!