题目描述

你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$。
在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时、异或一些数后或是最后),将$x$变为$(\left \lfloor{\frac{2\times x}{2^n}}\right \rfloor \mod 2^n)$你想使$x$最后尽量大,而你的对手会使$x$最后尽量小。
你需要求出$x$最后的最大值,以及得到最大值的初值数量。


输入格式

第一行两个整数$n,m$。
第二行$m$个整数$a_1~a_m$。


输出格式

第一行输出一个整数,表示$x$最后的最大值。
第二行输出一个整数,表示得到最大值的初值数量。
第一个数正确得$6$分,两个数都正确再得$4$分。


样例

样例输入

2 3
1 2 3

样例输出

1
2


数据范围与提示

样例解释:

$x=0$时得到$0$,$x=1$时得到$1$,$x=2$时得到$1$,$x=3$时得到$0$。

数据范围:

对于$20\%$的数据,$n\leqslant 10$,$m\leqslant 100$。
对于$40\%$的数据,$n\leqslant 10$,$m\leqslant 1,000$。
对于另外$20\%$的数据,$n\leqslant 30$,$m\leqslant 10$。
对于$100\%$的数据,$n\leqslant 30$,$m\leqslant 100,000$,$0\leqslant a_i<2^n$。


题解

注意上面那个神奇的式子:$(\left \lfloor{\frac{2\times x}{2^n}}\right \rfloor \mod 2^n)$。

刚一看时一脸懵,定睛一看……还是一脸懵……

其实没有那么难,这道题就是将$x$进行了逻辑左移,其实就是说将$x$左移了一位,并将最高为补到了最后面。

那么我们来退一下式子:

  先设$q[i]$表示$a$数组的异或前缀和,对手在$i$时刻使出“技能”。

  那么:$ans=((x\ xor\ a_i)\ll 1)xor(a_i\ xor\ a_m)$。

  展开:$ans=(x\ll 1)xor(a_i\ll 1)xor\ a_i\ xor\ a_m$。

  那么我们需要找的是一个$x$使其$xor(a_i\ll 1)xor\ a_i\ xor\ a_m$最大。

一般碰到$01$串的题就考虑$Trie$树,这道题一样,我们来构建一个$01Trie$数,将所有$a_i$逻辑左移的值$xor$起来,注意对手可以在一开始就使用“技能”,所以一开始要插入,依次$xor$其后缀和插入$Trie$树,然后在这棵$Trie$树上跑$DFS$即可。

在$DFS$时分为一下三种情况:

  $\alpha.$当前节点既有$0$孩子,也有$1$孩子时,需要往两侧走,$ans$不变。

  $\beta.$如果有$0$儿子,没有$1$儿子,那么往$0$儿子走一定更优。

  $\gamma.$如果有$1$儿子,没有$0$儿子,同理,不再赘述。

统计答案排个序就好了。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[200000],sum[200000];
int trie[4000000][2],cnt=1;
int ans[4000000],ansss;
int flag;
void insert(int x)//插入
{
int num=1;
for(int i=1;i<=n;i++)
{
if(!trie[num][(x>>(n-i)&1)])trie[num][(x>>(n-i)&1)]=++cnt;
num=trie[num][(x>>(n-i)&1)];
}
}
void dfs(int x,int num,int dep)//dfs
{
if(dep<0)
{
ans[++ans[0]]=num;
return;
}
if(!trie[x][0]&&trie[x][1])dfs(trie[x][1],num^(1<<dep),dep-1);//三种情况
else if(trie[x][0]&&!trie[x][1])dfs(trie[x][0],num^(1<<dep),dep-1);
else{dfs(trie[x][0],num,dep-1);dfs(trie[x][1],num,dep-1);}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
for(int i=m;i;i--)sum[i]=sum[i+1]^a[i];
for(int i=0;i<=m;i++)
{
flag=flag^(2*a[i]/(1<<n)+2*a[i])%(1<<n);//逻辑左移
insert(flag^sum[i+1]);//插入
}
dfs(1,0,n-1);
sort(ans+1,ans+ans[0]+1);
for(int i=ans[0];i;i--)
if(ans[i]==ans[ans[0]])ansss++;
else break;
printf("%d\n%d",ans[ans[0]],ansss);
return 0;
}

rp++

[CSP-S模拟测试]:big(Trie树+贪心)的更多相关文章

  1. 【BZOJ3261】最大异或和 Trie树+贪心

    [BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N.       有   M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个 ...

  2. poj3764(dfs+Trie树+贪心)

    题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...

  3. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)

    传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码

  4. BZOJ4567 [Scoi2016]背单词 【trie树 + 贪心】

    题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树 ...

  5. 【bzoj3261】【最大异或和】可持久化trie树+贪心

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...

  6. [SCOI2016] 背单词 (Trie 树,贪心)

    题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...

  7. 51nod 1526 分配笔名(Trie树+贪心)

    建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...

  8. 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)

    传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...

  9. 【BZOJ4260】Codechef REBXOR Trie树+贪心

    [BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...

随机推荐

  1. spring boot 异常汇总

    spring boot JPA 异常: org.springframework.data.mapping.PropertyReferenceException: No property role fo ...

  2. 磁盘管理|df、du|分区 fdisk |格式化

    3.磁盘管理 3.1命令df ·用于查看已挂载磁盘的总容量,使用容量,剩余容量等. -i:查看inodes的使用情况 -h:使用合适的单位显示 -k:以KB为单位显示 -m:以MB为单位显示 3.1. ...

  3. [转帖]CBO和RBO

    http://www.itpub.net/thread-263395-1-1.html 参数不能随便改啊.. optimizer_features_enable('8.1.7') ORACLE 提供了 ...

  4. 终于有人把 Docker 讲清楚了,万字详解!

    一.简介 1.了解Docker的前生LXC LXC为Linux Container的简写.可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性.相当于C++中 ...

  5. Chrome开发者工具详解(五)之Network面板

    Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Se ...

  6. 关于微信小程序 modal弹框组件的介绍

    微信小程序 modal: 这里对微信小程序中 modal组件进行详细解析,我想开发微信小程序的小伙伴可以用到,这里小编就记录下modal的知识要点. modal modal类似于javascript中 ...

  7. 如何让css隐藏滚动条 兼容谷歌、火狐、IE等各个浏览器

    项目中,页面效果需要展示一个页面的移动端效果,使用的是一个苹果手机样式背景图,咋也没用过苹果,咋也不敢形容. 如下图所示: 在谷歌浏览器如图一滚动条顺利隐藏,但是火狐就如图二了,有了滚动条丑的一批. ...

  8. 2019-10-31-VisualStudio-2019-新特性

    title author date CreateTime categories VisualStudio 2019 新特性 lindexi 2019-10-31 08:48:27 +0800 2019 ...

  9. tp5 模板参数配置(模板静态文件路径)

    tp5 模板参数配置(模板静态文件路径) // 模板页面使用 <link rel="stylesheet" type="text/css" href=&q ...

  10. Python 面向对象编程之进阶使用

    我们在https://www.cnblogs.com/yinsedeyinse/p/9976280.html中学习了面向对象的编程方法.现在学习他的进阶用法. 1. 静态方法 2. 类方法 3. 属性 ...