【题目描述】

  给定n个非负整数A[1], A[2], ……, A[n]。

  对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n-1)/2个新的数。求这些数(不包含A[i])中前k小的数。

  注:xor对应于pascal中的“xor”,C++中的“^”。

【输入格式】

  第一行2个正整数 n,k,如题所述。

  以下n行,每行一个非负整数表示A[i]。

【输出格式】

  共一行k个数,表示前k小的数。

【样例输入】

4 5

1

1

3

4

【样例输出】

0 2 2 5 5

【样例解释】

  1 xor 1 = 0 (A[1] xor A[2])

  1 xor 3 = 2 (A[1] xor A[3])

  1 xor 4 = 5 (A[1] xor A[4])

  1 xor 3 = 2 (A[2] xor A[3])

  1 xor 4 = 5 (A[2] xor A[4])

  3 xor 4 = 7 (A[3] xor A[4])

  前5小的数:0 2 2 5 5

【数据范围】

  第一个数据点,n <= 1000;

  第二个数据点,k = 1;

  对于40%的数据,n <= 10000; k <= 10;

  对于60%的数据,n <= 20000;

  对于100%的数据,2 <= n <= 100000; 1 <= k <= min{250000, n*(n-1)/2};0 <= A[i] < 2^31

Solution

  由于出题人数据是随机生成的就卡不掉我的暴力骗分啦~不过我是构了一组。

  很明显,a-b<=a^b<=a+b

  先对A[]排序,选取k个可能成为答案的数,用堆或者线段树维护修改和查询。当插进去的数比当前堆中的最大数还大的话就break。

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
int main()
{
freopen("xorit.in","w",stdout);
srand(time());
int n=,m=,mod=<<;mod--;
printf("%d %d\n",n,m);
for(int i=;i<=n;i++)printf("%d ",rand());
}

Data Maker

 #include<cstdio>
#include<algorithm>
#include<cstring>
int t[],d,n,k,a[],tmp;
int main()
{
scanf("%d%d",&n,&k);int i,j,l;
memset(t,,sizeof(t));
for(d=;d<k;d<<=);
for(i=;i<=n;i++)scanf("%d",&a[i]);
std::sort(a+,a++n);
for(i=;i<=n;i++)
for(j=i-;j;j--)t[++tmp]=a[i]^a[j];
std::sort(t+,t++tmp);
for(i=;i<=k;i++)printf("%d ",t[i]);
}

暴力

 #include<cstdio>
#include<algorithm>
#include<cstring>
int t[],d,n,k,a[],cnt,tmp,now;
int main()
{
scanf("%d%d",&n,&k);int i,j,l,o;k++;
for(d=;d<k;d<<=);
for(i=;i<=n;i++)scanf("%d",&a[i]);
std::sort(a+,a++n);
for(i=;i<=n;i++)
for(j=i-;j;j--)
{
tmp=a[i]^a[j];now=;
for(l=k+d-;l;l>>=)now<t[l]?now=t[l]:;
if(now==&&cnt==k)break;
if(cnt<k)
{
if(now<tmp)now=tmp;
for(t[l=d+cnt]=tmp,cnt++,l>>=;l;l>>=)
{
tmp=t[l<<]>t[l<<|]?t[l<<]:t[l<<|];
t[l]=tmp;
}
}
else
{
if(tmp>=now&&a[i]-a[j]>now)break;
if(tmp<now)
{
for(o=;o<d;t[o<<|]==now?o=o<<|:o<<=);
if(now<tmp)now=tmp;
for(t[o]=tmp,o>>=;o;o>>=)
{
tmp=t[o<<]>t[o<<|]?t[o<<]:t[o<<|];
t[o]=tmp;
}
}
}
}
std::sort(t+d,t+d+k);k--;
for(i=d;i<d+k;i++)printf("%d ",t[i]);
}

std

另外还有一种二进制分组的做法。考虑在二进制中前k位相同的数,k+1位对答案的贡献为cnt[0]*cnt[1],cnt[i]表示k+1位为i的数。

于是我们可以找到第k小的答案范围,然后暴力就行了。复杂度O(nlogn)

还有一种可持久化Trie树的做法--详见Noi超级钢琴

[FJSC2014]异或之的更多相关文章

  1. [BZOJ3696][FJSC2014]化合物(异或规则下的母函数)

    题目:http://hzwer.com/3708.html 分析: 类似树分治思想,设f[x][i]表示以x为根的子树的所有点中,与x的距离为i的点有多少个,这个可以预处理出来 然后我们考虑每颗子树对 ...

  2. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  3. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  4. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  5. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  6. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  7. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  8. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

  9. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

随机推荐

  1. 如何使用Git上传项目代码到代码服务器

    如你本机新建Git项目 地址:git@github.com:yourName/yourRepo.git,远程代码库服务器地址:192.168.10.1,远程代码服务器账户名密码:admin 密码:12 ...

  2. day-9

    /* 考前第9天 区间*的线段树居然卡住了23333 明天再搞搞 今天针对考试复习了几个板子 手动堆都打了 实测比priority快 下午考试成了炮灰233333 晚上复习矩阵乘法 手推9*9矩阵 可 ...

  3. LA 4329(树状数组)

    题目描述: N <tex2html_verbatim_mark>(3N20000) <tex2html_verbatim_mark>ping pong players live ...

  4. PHP 数组转字符串,与字符串转数组

    implode 使用一个字符串将数组变成字符串 <?php $array = array('lastname', 'email', 'phone'); $comma_separated = im ...

  5. jQuery中的on()和click()的区别 分类: 前端 HTML jQuery 2014-11-06 10:26 96人阅读 评论(0) 收藏

    HTML页面代码 <div> <h1>Click</h1> <button class="add">Click me to add ...

  6. 停止Java线程,小心interrupt()方法

    来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决 ...

  7. LLDB中的小技巧

    1.打印视图层次结构 po [self.view recursiveDescription]   2.临时调整界面UI      比如说现在你需要改变一个控件的背景色来更好的查看布局的问题,这是就不需 ...

  8. hdu 1788 Chinese remainder theorem again(最小公倍数)

    Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2( ...

  9. ubuntu 14.04安装amd omega 驱动

    驱动共分4部分: fglrx_14.501-0ubuntu1_amd64_UB_14.01.deb      52.0MB fglrx-core_14.501-0ubuntu1_amd64_UB_14 ...

  10. 在js脚本里计算多个小数的加法问题

    当在js脚本里计算多个小数的加法时,算得的结果往往会自动取整,这时候我们就应该加入以下代码: function toDecimal(x) { var val = Number(x); if (!isN ...