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取模
定义lowbit(0)=0
题解:
官方题解给出的Trie的做法...

但是我有一个分治的做法:
我们从低到高枚举二进制位:
在每个二进制位枚举时,将所有的数按照这一二进制位为0或为1分成两组
这样一共有两组的siz的乘积对的数在这一位上对答案做出贡献
由于我们发现以后这两组数间不可能存在一组数再次对答案做出贡献
所以我们可以直接将问题划分成两个不相干的子问题,递归求解.
也是\(O(nloga_i)\)的
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 50010;
const int mod = 998244353;
int a[maxn],b[2][maxn],ans;
void solve(int l,int r,int d){
if(d == 30 || l == r) return;
b[0][0] = b[1][0] = 0;
for(int i=l;i<=r;++i){
if((a[i]>>d)&1) b[1][++b[1][0]] = a[i];
else b[0][++b[0][0]] = a[i];
}
ans += ((1<<d)*(b[1][0]*b[0][0]%mod)) % mod;
if(ans >= mod) ans -= mod;
for(int i=1;i<=b[1][0];++i) a[l+i-1] = b[1][i];
for(int i=1;i<=b[0][0];++i) a[l+b[1][0]-1+i] = b[0][i];
int mid = l+b[1][0]-1;
if(l <= mid) solve(l,mid,d+1);
if(mid+1 <= r) solve(mid+1,r,d+1);
}
inline void work(int num){
int n;read(n);
for(int i=1;i<=n;++i) read(a[i]);
ans = 0;solve(1,n,0);
printf("Case #%d: %d\n",num,ans<<1);
}
int main(){
int T;read(T);
for(int i=1;i<=T;++i) work(i);
getchar();getchar();
return 0;
}
hdu 5269 ZYB loves Xor I 分治 || Trie的更多相关文章
- hdu 5269 ZYB loves Xor I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...
- 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 ...
- hdu 5269 ZYB loves Xor I && BestCoder Round #44
题意: ZYB喜欢研究Xor,如今他得到了一个长度为n的数组A. 于是他想知道:对于全部数对(i,j)(i∈[1,n],j∈[1,n]).lowbit(AixorAj)之和为多少.因为答案可能过大,你 ...
- hdu 5269 ZYB loves Xor I(字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5269 思路分析:当lowbit(AxorB)=2p 时,表示A与B的二进制表示的0-p-1位相等,第p ...
- HDU 5269 ZYB loves Xor I (二分法)
题意: 给出一个序列,对每两个数求异或结果后取最低位的1出来作为一个数,然后求这些数字的和.比如:{a,b,c},结果是lowbit(a^b)+lowbit(a^c)+lowbit(b^a)+lowb ...
- 【HDU】5269 ZYB loves Xor I
[算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...
- bestcoder r44 p3 hdu 5270 ZYB loves Xor II
这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR 然后就想了想昨晚的思路 发现可做 ...
- HDU--5269 ZYB loves Xor I (字典树)
题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制 我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...
- ZYB loves Xor I(hud5269)
ZYB loves Xor I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
随机推荐
- 【网络与系统安全】20179209 wireshark和nmap实验
TCP三次握手包 在进行实验前,先梳理一遍TCP三次握手的过程,这个图是我本科学网络时画过不少于十遍的图,我觉得非常有纪念意义. 稍作解释,第一次握手,客户端发起请求连接,发送一个标志位为SYN的ip ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- 短时程突触可塑性(short-term synaptic plasticity)
介绍 神经元的突触可塑性一般被认为是大脑学习与记忆的分子生物学机制,它是指突触传递效率增强或减弱的变化现象.若这种变化只持续数十毫秒到几分,便称之为短时程突触可塑性,其中效率增强与减弱分别叫做短时程增 ...
- centOS-64位通过YUM源安装nginx
第一步:在 /etc/yum.repos.d/ 目录下,建立名叫nginx.repo的软件源配置文件. 文件 nginx.repo 的内容是: [nginx] name=nginx re ...
- 在VS2010下打开VS2008项目的解决办法
如何在vs2010中打开vs2008项目文件? 第一步:以记事本方式打开该项目的sln解决方案,找到这两行信息,分别如下:Microsoft Visual Studio Solution File, ...
- DHTMLTree、Dtree和Ztree的学习使用
一.DHTMLTree是树菜单,允许我们快速开发界面优美,基于Ajax的javascript库.她允许在线编辑,拖拽,三种状态(全选.不选.半选),复选框等模式.同时在加载大数据量的时候,仍然可以保持 ...
- selenium鼠标悬停操作
有些网页一打开会有一个弹窗,弹窗不消失无法进行取元素操作,只有把鼠标悬停在上面弹窗才会消失,这时就用到了selenium的悬停操作 鼠标悬停 move_to_element() 定位到要悬停的元素 ...
- ubuntu service XXX start启动报start: Rejected send message, 1 matche
service cron restart命令报错如下: stop: Rejected send message, 1 matched rules; type="method_call&quo ...
- html5 css3 进度条特效
https://www.html5tricks.com/tag/css3%E8%BF%9B%E5%BA%A6%E6%9D%A1/page/3
- rewrite_static
<?php class MyObject { public static $myStaticVar = 0; function myMethod() { self::$myStaticVar + ...