zoukankan      html  css  js  c++  java
  • [luogu3760 TJOI2017] 异或和(树状数组)

    传送门

    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;
    }
    
  • 相关阅读:
    Modbus RTU与Modbus TCP的区别
    《对比Excel,轻松学习Python数据分析》笔记
    字符串 批量删除
    地图服务在线资源
    Java环境变量配置及maven配置
    Android学习路线
    MySQL备份脚本,应该这么写
    Windows中mysql5.6升级5.7
    SQL Server数据分析面试题(202008)
    PYTHON-未知错误
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9807624.html
Copyright © 2011-2022 走看看