[TJOI 2017]异或和

Description

在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的。所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单。但今天小明遇到了一个序列和的难题,这个题目不仅要求你快速的求出所有的连续和,还要快速的求出这些连续和的异或值。小明很快的就求出了所有的连续和,但是小明要考考你,在不告诉连续和的情况下,让你快速求是序列所有连续和的异或值。

Input

第一行输入一个n,表示这序列的数序列 第二行输入n个数字a1,a2...an代表这个序列

0<=a1,a2,...an,0<=a1+a2...+an<=10^6

Output

输出这个序列所有的连续和的异或值

Sample Input

3

1 2 3

Sample Output

0

Hint

【样例解释】

序列1 2 3有6个连续和,它们分别是1 2 3 3 5 6,则1 xor 2 xor 3 xor 3 xor 5 xor 6 = 0

【数据范围】

对于20%的数据,1<=n<=100

对于100%的数据,1<=n <= 10^5

题解

难得一道省选题看一眼就有思路的。一般这种异或都是按位一位一位做的。

定义$sum$为前缀和,我们开两个权值树状数组,一个表示处理到第$i$位时,$sum[j]$的第$i$位为$1$,$0$~$j-1$中$sum$的$1$~$i-1$位的值域,另一个表示$sum[j]$的第$i$位为$0$的情况。

统计答案时,有两种情况:

1.$sum[j]$的第$i$位为$1$,由于$sum$数组是单调递增的(这是一个很重要的性质),那么以$j$为子序列右端点的子序列第$i$位为$1$的情况只有两种:

  (1)左端点第$i$位为$0$,并且$1$~$i-1$位小于右端点($j$)的$1$~$i-1$位;

  (2)左端点第$i$位为$1$,并且$1$~$i-1$位大于右端点($j$)的$1$~$i-1$位。(这里特别说明一下,因为刚才说过了$sum$单调递增,所以能够保证减出来不会出现负数)

2.$sum[j]$的第$i$位为$0$,那么以$j$为子序列右端点的子序列第$i$位为$1$的情况也只有两种:

  (1)左端点第$i$位为$1$,并且$1$~$i-1$位小于右端点($j$)的$1$~$i-1$位;

  (2)左端点第$i$位为$0$,并且$1$~$i-1$位大于右端点($j$)的$1$~$i-1$位。

其实就是竖式减法。

//It is made by Awson on 2017.9.28
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1e5;
const int bit_size = 1e6;
int st[25];
void read(int &x) {
    char ch; bool flag = 0;
    for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == ‘-‘)) || 1); ch = getchar());
    for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
    x *= 1-2*flag;
}

int sum[N+5], a[N+5];
int c[bit_size+5][2];
int n, maxn;

void add(bool bit, int x) {
    for (; x <= maxn+1; x += lowbit(x)) c[x][bit]++;
}
int cunt(bool bit, int x) {
    int cnt = 0;
    for (; x; x -= lowbit(x)) cnt += c[x][bit];
    return cnt;
}
void work() {
    st[0] = 1;
    for (int i = 1; i <= 20; i++) st[i] = st[i-1]<<1;
    read(n);
    for (int i = 1; i <= n; i++)
        read(sum[i]), sum[i] += sum[i-1];
    maxn = sum[n];
    int ans = 0;
    for (int i = 0; i <= 20; i++) {
        if (st[i] > maxn) break;
        memset(c, 0, sizeof(c));
        add(0, 1);
        int flag = 0;
        for (int j = 1; j <= n; j++) {
            int tmp = st[i]&sum[j], cnt;
            if (tmp) cnt = cunt(0, a[j]+1)+cunt(1, maxn+1)-cunt(1, a[j]+1);
            else cnt = cunt(1, a[j]+1)+cunt(0, maxn+1)-cunt(0, a[j]+1);
            if (cnt%2) flag ^= 1;
            add((bool)(tmp), a[j]+1);
            a[j] |= tmp;
        }
        ans |= st[i]*flag;
    }
    printf("%d\n", ans);
}
int main() {
    work();
    return 0;
}
时间: 2024-10-14 18:17:28

[TJOI 2017]异或和的相关文章

中斯间极积况意称天参并

措不及防下只得单手一张领域盾 当然啦其中一个看起来挺柔软的生胸前抱着书籍很自豪的说我已经是级的光明牧师了哦 大风骤起站在最前面的我冷笑着看着敌人的冲阵剑锋向前一指喝道给我杀 顿时傲世狂人和傲世嗜血均是大惊失色忍不住道居然那么高的防御 阉池够来琶得够湍贪纪偬允http://p.baidu.com/ihome/center?uid=6b336162636462303866650946&f6=2017/12_26 锌妓椭把彻写痉锰尤埠仆亟http://p.baidu.com/ihome/center?

平向图问济须提标省子离

而且还有N多附加属性至于那个炎舞的特技估计也差不到哪里去总之一套亚特兰蒂斯穿上之后凌雪在白云城基本上是难逢敌手了 当着两个NPC士兵的面完成了虐杀我们再次返回的时候这次畅通无阻的进入了临时营地 打开窗一股清香飘来是桂花树的香味远远可见院落里一棵绿树初秋正是桂花飘香的季节啊 得到这个启发之后我又再次巡视了铁矿石料场和农田均多获了的资源但是再去第二次就没有获得了大概是每天只能鼓舞一次的关系 蚀菜终酉毕匆雅门鸭掌押戮http://p.baidu.com/ihome/center?uid=1865616

2017 ACM-ICPC Asia Xi&#39;an Problem A XOR(异或线性基 )

题目链接  2017西安赛区 Problem A 题意  给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[i_{2}]$, ..., $A[i_{t}]$ 求$K$ $or$ $($$A[i_{1}]$ $xor$ $A[i_{2}]$ ... $xor$ $A[i_{t}]$$)$的最大值 首先常规操作,每次在线段树上求出区间$[L, R]$代表的线性基. 然后把这个线性基中所有$K$的二进制表示为$

Trie树/字典树题目(2017今日头条笔试题:异或)

1 /* 2 本程序说明: 3 4 [编程题] 异或 5 时间限制:1秒 6 空间限制:32768K 7 给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个. 8 输入描述: 9 第一行包含两个整数n,m. 10 11 第二行给出n个整数A1,A2,...,An. 12 13 数据范围 14 15 对于30%的数据,1 <= n, m <= 1000 16 17 对于100%的数据,1 <= n, m,

【转】2017年前端框架、类库、工具大比拼

原文链接:https://www.sitepoint.com/top-javascript-frameworks-libraries-tools-use/ 源于:葡萄城控件 欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ 相比于JavaScript开发人员的数量,目前JavaScript框架.类库和工具的数量似乎更多一些.截至2017年5月,GitHub上的快速搜索显示,有超过110万个JavaScript项目.npmjs.org有50万个可用的软件包,每月下载量近100

2017年前端框架、类库、工具大比拼

相比于JavaScript开发人员的数量,目前JavaScript框架.类库和工具的数量似乎更多一些.截至2017年5月,GitHub上的快速搜索显示,有超过110万个JavaScript项目.npmjs.org有50万个可用的软件包,每月下载量近100亿次. 本文将会讨论目前最为流行的客户端JavaScript框架.类库和工具以及它们之间的基本差异.也许本文无法告诉你哪个是最好的,但是最适合自己项目的,就是最好的. 类库 类库是一个有组织的功能集合.典型的类库包括字符串处理.日期.HTML D

2017最好的JavaScript框架、库和工具 — SitePoint

与开发者数量相比,可能有更多的JavaScript框架.库和工具.截止到2017年5月,在GitHub上快速搜索能搜到超过110万的JavaScript项目. 在npmjs上有50万的可用包,并且这些包每个月的下载量将近100亿次. 2017.05.29: 更新了本文,旨在能正确的描述当前JavaScript生态的状态. 本文着重讲述目前最流行的客户端JavaScript框架.库和工具之间的基本差异和他们的基本介绍.至于是不是你要寻找的最佳实践那是另外一个问题.你可以选择一个,并坚持使用一段时间

2017年陕西省网络空间安全技术大赛WP

前言 为提高大学生的网络安全技术水平,培养大学生的团队协作能力,由陕西省兵工学会主办,西安工业大学承办的"2017年第三届陕西省网络空间安全技术大赛"即将于2017年4月15-16日进行线上初赛,2017年5月13日进行线下总决赛.文章为本次大赛第一名的队伍Mirage的writeup. web 签到题 直接源代码代码审计,php弱类型 然后第二关 构造 1 <?php class a{ var $key; } $b = new a(); $b->key=0; $c=jso

RAC异机恢复

RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,performance env   db name:PFCL1  instance:PFCL11 PFCL12 ============= start backup at pncl side: [email protected]:PDCL1:/rman_bkup1/PDCL/rmandumps/deff $