位运算很好的一个性质是可以单独每一位考虑。。。。。

题解请看:http://blog.csdn.net/skywalkert/article/details/45401245

对于异或的和,先枚举位,求所有异或和和中该位为1的有多少个,再乘以该位的大小(2的多少次方)。

即单独每一位考虑,每位带的权不一样。

对于和的异或,只需知道每一位中和的改位为1的奇偶性,就可以知道最终的异或值上该位是0还是1。

也是单独考虑每一位,看该位为0或1的条件。

 /**************************************************************
Problem: 4017
User: idy002
Language: C++
Result: Accepted
Time:9896 ms
Memory:3544 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
#define Mod 998244353
using namespace std; typedef long long dnt; int n;
int aa[N]; namespace Task1 {
dnt ans;
int cnt[];
dnt mpow( dnt a, int b ) {
dnt rt;
for( rt=; b; b>>=,a=a*a%Mod )
if( b& ) rt=rt*a % Mod;
return rt;
}
void main() {
for( int b=; b<=; b++ ) {
cnt[] = cnt[] = ;
for( int i=; i<=n; i++ ) {
int bb = (aa[i]>>b)&;
int c0 = cnt[];
int c1 = cnt[];
cnt[^bb] = c0;
cnt[^bb] = c1;
cnt[bb]++;
ans = (ans+cnt[]*mpow(,b)) % Mod;
}
}
printf( "%lld ", ans );
}
};
namespace Task2 {
dnt s[N];
dnt disc[N], dtot;
int bit[][N];
dnt ans;
void init() {
memset( bit, , sizeof(bit) );
}
void modify( int bit[], int a, int delta ) { // a in [1,n]
for( int i=a; i<=dtot; i+=i&-i )
bit[i] += delta;
}
int query( int bit[], int a ) {
int rt = ;
for( int i=a; i; i-=i&-i )
rt += bit[i];
return rt;
}
void main() {
for( int i=; i<=n; i++ )
s[i] = s[i-] + aa[i];
for( int b=; b<=; b++ ) {
dnt cnt = ;
dnt mask = (1LL<<b) - ;
dtot = ;
disc[++dtot] = ;
for( int i=; i<=n; i++ )
disc[++dtot] = s[i] & mask;
sort( disc+, disc++dtot );
dtot = unique( disc+, disc++dtot ) - disc - ;
init();
modify( bit[], lower_bound(disc+,disc++dtot,)-disc, + );
for( int i=; i<=n; i++ ) {
dnt bmid = (s[i]>>b) & ;
dnt brgt = s[i] & mask;
int irgt = lower_bound( disc+, disc++dtot, brgt ) - disc;
if( bmid ) {
cnt += query( bit[], irgt );
cnt += query( bit[], dtot ) - query( bit[], irgt );
} else {
cnt += query( bit[], dtot ) - query( bit[], irgt );
cnt += query( bit[], irgt );
}
modify( bit[bmid], irgt, + );
}
ans |= (cnt&) ? (1LL<<b) : ;
}
printf( "%lld\n", ans );
}
}; int main() {
scanf( "%d", &n );
for( int i=; i<=n; i++ )
scanf( "%d", aa+i );
Task1::main();
Task2::main();
}

bzoj 4017 子序列和的异或以及异或的和的更多相关文章

  1. bzoj 4017: 小Q的无敌异或

    4017: 小Q的无敌异或 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 593  Solved: 197[Submit][Status][Discu ...

  2. BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )

    题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...

  3. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 De ...

  4. 【BZOJ 1770 】 [Usaco2009 Nov]lights 燈 dfs+异或方程组

    这道题明显是异或方程组,然而解不一定唯一他要的是众多解中解为1的数的最小值,这个时候我们就需要dfs了我们dfs的时候就是枚举其有不确定解的数上选0或1从而推知其他解,由于我们dfs的时候先0后1,虽 ...

  5. bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基

    题目链接 题意 给定\(n\)个数,将其所有的子集(\(2^n\)个)的异或和按升序排列.给出一个询问\(q\),问\(q\)在该序列中第一次出现位置的下标(下标从\(1\)开始). 题解 结论 记其 ...

  6. 51nod 1301 集合异或和——异或dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 好题!看了TJ才会. 因为是不可重集合,所以当然有前 i 个 ...

  7. [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)

    Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...

  8. 51Nod 1301 集合异或和 —— 异或DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 参考博客:https://blog.csdn.net/qq_ ...

  9. AtCoder Regular Contest 098 D - Xor Sum 2 区间异或=相加 DP思想

    题意:给出n个数,求它的连续子序列中,满足下列公式,(l,r)的对数有多少对 Al xor Al+1 xor … xor Ar=Al + Al+1 + … + Ar 思路:由题意可以得到,连续子序列, ...

随机推荐

  1. 关于Unity启动时间过长(启动黑屏时间长)的问题!!! 牛逼... 思路不错...

    http://blog.csdn.net/u012169685/article/details/52068809

  2. WGS84转大地2000

    1.创建自定义地理(坐标)变换: 2.选择源坐标系和目标坐标系: 3.自定义地理转换方法,选择COORDINATE_FRAME; 4.选择投影工具: 5.在地理变换处选择刚才自定义变换.

  3. Python基础一(基本类型和运算符)

    在说Python的基本类型钱我们先说下Python注释方式有哪几 Python注释 行注释 #行注释 行注释用以#开头,#右边的所有文字当做说明,而不是真正要执行的程序,起辅助说明作用 # 我是注释, ...

  4. redis tutorail

    命令 set     get    incr expire  秒  ttl    -1 不会过期 list  : lpush  rpush  lpop  rpop   lrange   llen se ...

  5. HDU 2476 String painter(区间DP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...

  6. HDU 3068 最长回文(manacher模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求字符串s中最长的回文子串 解题思路:manacher模板 代码 #include&l ...

  7. INSTEAD OF与AFTER触发器

    INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...

  8. 20165203《Java程序设计》第七周Java学习总结

    20165203<Java程序设计>第七周Java学习总结 教材学习内容总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称MySQL,是世 ...

  9. PowerTool x64驱动模块逆向分析(持续更新)

    比赛打完了,来继续搞了,因为那个主动防御正在写,所以想找找思路正好想到可以来逆向一下PT的驱动模块看看pt大大是怎么写的程序. PT x64版本的驱动模块是这个kEvP64.sys. 0x0 先来看看 ...

  10. 好久没有写过SQL了,今天写了一句select in留存

    应同事要求,直接去接数据库的数据. 数据C里有一个name是查询的起始. 然后,B其实是一个多对多的中间表, 通过B查出id之后, 就可以在A里找到需要的数据了. select name from A ...