题意:

ZYB喜欢研究Xor,如今他得到了一个长度为n的数组A。

于是他想知道:对于全部数对(i,j)(i∈[1,n],j∈[1,n])。lowbit(AixorAj)之和为多少.因为答案可能过大,你须要输出答案对998244353取模后的值
定义lowbit(x)=2k,当中k是最小的满足(x and 2k)>0的数
特别地:lowbit(0)=0
输入描写叙述
一共T(T≤10)组数据,对于每组数据:
第一行一个正整数n,表示数组长度
第二行n个非负整数,第i个整数为Ai
n∈[1,5∗104],Ai∈[0,229]
输出描写叙述
每组数据输出一行Case #x: ans。x表示组数编号。从1開始。ans为所求值。
输入例子
2
5
4 0 2 7 0
5
2 6 5 4 0
输出例子
Case #1: 36
Case #2: 40

官方题解:

我们考虑,当A xor B的答案为2p时,A和B表示成二进制数后末p−1位肯定同样
于是我们维护一颗字母树。将每一个数表示成二进制数后翻转能够下。插入字母树
统计答案时,我们找出Ai的二进制数翻转后在字母树上的路径,对于路径上每一个点x。设他走的边是v。且当前为
第k位,则和他xor后lowbit为2k的数的个数为trans(x,v^1)的子树大小。
trans(x,v)表示字母树上在结点x,走连出去的字母为v的边到达的结点
时间复杂度:O(nlogA)

总结:

1.这道题一直拖着没有写总结,感觉一直没有从变化中观察到不变

2.当时自己比赛没有做出来这个题目,可能当时校赛得了第7。导致有些自负吧,事实上还是能力的不足,好的行为并没

有培养成好的习惯。

3.后来也是看了一眼bc群上的说trie,才想到的。以下总结一下失败的原因吧。

4.我開始是想对于除0以外的数按lowbit值排序(也就是最低位出现的1排序),lowbit同样的再依照除此位的lowbit排

序,没搞出来。

5.假设刚才的思路清晰之后,事实上就是分层处理,按lowbit值同样的为一组,对于不同组直接能够算出,对于同组,减

掉刚才的lowbit。再求lowbit。继续分组运算。

6.这不就是不停地分层处理吗?!

那能够用trie这样的数据结构直接来做

7.比赛时候没有把算法考虑清楚就急忙写代码,以后不许再犯同样的大忌了

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
#define MAXN 5000500
#define lowbit(i) ((i) & (-(i)))
#define MOD 998244353
struct Trie
{
int ch[MAXN][2],val[MAXN],cnt;
LL ans;
void init()
{
ans = cnt = val[0] = ch[0][0] = ch[0][1] = 0;
}
void insert(int v)
{
val[0]++;
int deep = 0,num = val[0],next = 0;
for(int i = 0;i < 30;i++)
{
int c = v & 1;
if(!ch[next][c])
{
ch[next][c] = ++cnt;
val[cnt] = ch[cnt][0] = ch[cnt][1] = 0;
}
val[ch[next][c]]++;
deep++;
ans += ((num - val[ch[next][c]]) << deep);
ans %= MOD;
next = ch[next][c];
v >>= 1;
num = val[next]; }
}
}trie;
int main()
{
int _,n,cur;
for(int kcas = scanf("%d",&_);kcas <= _;kcas++)
{
trie.init();
for(int i = scanf("%d",&n);i <= n;i++)
{
scanf("%d",&cur);
trie.insert(cur);
}
printf("Case #%d: %I64d\n",kcas,trie.ans);
}
}

hdu 5269 ZYB loves Xor I &amp;&amp; BestCoder Round #44的更多相关文章

  1. hdu 5269 ZYB loves Xor I

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  2. HDU 5269 ZYB loves Xor I Trie树

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  3. hdu 5269 ZYB loves Xor I(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5269 思路分析:当lowbit(AxorB)=2p 时,表示A与B的二进制表示的0-p-1位相等,第p ...

  4. hdu 5269 ZYB loves Xor I 分治 || Trie

    题目大意: 长度为\(n\)的数组A.求对于所有数对\((i,j)(i \in [1,n],j \in [1,n])\),\(lowbit(A_i xor A_j)\)之和.答案对998244353取 ...

  5. HDU 5269 ZYB loves Xor I (二分法)

    题意: 给出一个序列,对每两个数求异或结果后取最低位的1出来作为一个数,然后求这些数字的和.比如:{a,b,c},结果是lowbit(a^b)+lowbit(a^c)+lowbit(b^a)+lowb ...

  6. 【HDU】5269 ZYB loves Xor I

    [算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...

  7. bestcoder r44 p3 hdu 5270 ZYB loves Xor II

    这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR  然后就想了想昨晚的思路 发现可做 ...

  8. HDU--5269 ZYB loves Xor I (字典树)

    题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制  我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...

  9. ZYB loves Xor I(hud5269)

    ZYB loves Xor I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

随机推荐

  1. 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数

    我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...

  2. 极路由4pro(HC5962)安装python

    基本配置 其实极路由4.极路由4 pro.极路由B70都是一个型号的(HC5962) CPU:MT7621AT + MT7612EN + 7603EN 内存:256MB DDR3 RAM 闪存:128 ...

  3. Unity3D——加入剑痕效果(PocketRPG Trail插件)

    首先非常感谢大家的支持,因为近期项目吃紧,所以更新的速度可能会有点慢!希望大家谅解,当然大家的支持是我最大的动力.我也会尽我所能写出更好的文章,当然因为本人是个新手并且工作的内容也不是unity3D. ...

  4. [Struts2] No result defined for action ... and result input &amp; Invalid field value for field ...

    "No result defined for action ... and result input"错误一般发生在Struts2的拦截器拦截时遇到了问题时.Struts2会将跳转 ...

  5. C/C++数据类型的转换之终极无惑

    程序开发环境:VS2012+Win32+Debug 数据类型在编程中常常遇到.尽管可能存在风险,但我们却乐此不疲的进行数据类型的转换. 1. 隐式数据类型转换 数据类型转换.究竟做了些什么事情呢?实际 ...

  6. php中echo什么时候用到\"这个符号

    php中echo什么时候用到\"这个符号 当在引号中用到引号时,为避免混乱用\" \称为转义符,表示后面的字符和原来程序语言里的语法符号含义不同 常见的转义有 \" \' ...

  7. nyoj--138--找球号(二)(hash+邻接表)

    找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=1 ...

  8. nyoj--37--回文字符串(动态规划)

    回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然, ...

  9. MyBatis数据持久化(九)动态sql

    本文摘自:mybatis参考文档中文版 MyBatis的一个强大的特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能 ...

  10. firewall 实现数据的端口转发

    端口转发:firewall-cmd --add-port=80/tcp firewall-cmd --add-port=10050/tcp firewall-cmd --add-forward-por ...