big

题目描述

你需要在\([0,2^n)\)中选一个整数\(x\),接着把\(x\)依次异或\(m\)个整数\(a_1\sim a_m\)。

在你选出\(x\)后,你的对手需要选择恰好一个时刻(刚选完数时、异或一些数后或是最后),将\(x\)变为\((\lfloor\frac {2x}{2^n}\rfloor+2x)\pmod {2^n}\)。

你想使\(x\)最后尽量大,而你的对手会使\(x\)最后尽量小。

你需要求出\(x\)最后的最大值,以及得到最大值的初值数量。

输入格式

第一行两个整数\(n,m\)。第二行\(m\)个整数\(a_1\sim a_m\)。

输出格式

第一行输出一个整数,表示\(x\)最后的最大值。

第二行输出一个整数,表示得到最大值的初值数量。

第一个数正确得\(6\)分,两个数都正确再得\(4\)分。

说明

\(x=0\)时得到\(0\),\(x=1\)时得到\(1\),\(x=2\)时得到\(1\),\(x=3\)时得到\(0\)。

数据范围

对于\(20\%\)的数据,\(n\le 10,m\le 100\)。

对于\(40\%\)的数据,\(n\le 10, m\le 1000\)。

对于另外\(20\%\)的数据,\(n\le 30,m\le 10\)。

对于\(100\%\)的数据\(n\le 30,m\le 100000,\ 0\le a_i<2^n\)。


挺不错的题目。

考虑操作的特殊性,发现操作把序列左移了一位,并且超出的高位在低位进行了补全。

每一位只是位置换了,而值没换,而异或又是按位的,所以在第\(i\)次操作后左移等价于在第一次操作前进行左移,然后把前\(i\)次操作都左移。

这样的话,操作集合实质上只有\(m+1\)种了

我们可以把操作放到字典树上走。

注意\(A\)和\(B\)的目的。


Code:

#include <cstdio>
#define ll long long
const int N=1e5+10;
int n,m;
ll a[N];
ll change(ll s)
{
return ((s<<1)/(1ll<<n)+(s<<1))%(1ll<<n);
}
int ch[N*30][2],tot;
void build(ll s)
{
int now=0;
for(int i=n;i;i--)
{
int t=s>>i-1&1;
if(!ch[now][t]) ch[now][t]=++tot;
now=ch[now][t];
}
}
ll ans=0;int cnt;
void dfs(int now,int dep,ll sum)
{
if(dep==n)
{
if(sum>ans) ans=sum,cnt=1;
else if(sum==ans) ++cnt;
return;
}
if(ch[now][0]&&ch[now][1])
{
dfs(ch[now][0],dep+1,sum);
dfs(ch[now][1],dep+1,sum);
}
else if(ch[now][0])
dfs(ch[now][0],dep+1,sum|(1ll<<n-dep-1));
else if(ch[now][1])
dfs(ch[now][1],dep+1,sum|(1ll<<n-dep-1));
}
int main()
{
scanf("%d%d",&n,&m);
ll lf=0,rf=0;
for(int i=1;i<=m;i++)
scanf("%lld",a+i),rf^=a[i];
for(int i=0;i<=m;i++)
{
lf^=change(a[i]);
rf^=a[i];
build(lf^rf);
}
dfs(0,0,0);
printf("%lld\n%d\n",ans,cnt);
return 0;
}

2018.10.17

big 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  10. ACM: Just a Hook 解题报告 -线段树

    E - Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

随机推荐

  1. 堆数据结构(heapq)简单应用

    ## 堆数据结构(heapq)简单应用 # 堆数据结构 heapq # 常用方法:nlargest(),nsmallest(),heapify(),heappop() # 如果需要的个数较小,使用nl ...

  2. nginx2goaccess.sh脚本内容

    脚本github地址:https://github.com/stockrt/nginx2goaccess/blob/master/nginx2goaccess.sh 脚本内容: #!/bin/bash ...

  3. 【Js】JSON对象、JSON字符的使用总结

    JSON对象 / JSON字符串区别 抛出一个最常见的疑问:什么是“JSON对象”,什么是“JSON字符串”,它俩的区别是什么? 废话不多说,直接上代码. 1.JSON对象: // javascrip ...

  4. 做 JAVA 开发,怎能不用 IDEA!

    用了 IDEA,感觉不错.决定弃用 Eclipse 入门教程: www.cnblogs.com/yangyquin/p/5285272.html

  5. python快速改造:基础知识

    改造"Hacking"并不同于破坏"cracking" python快速改造:基础知识 一行就是一行,不管多少,不用加分号 交互式python解释器可以当作计算 ...

  6. 洛谷U32670 小凯的数字(比赛)

    题目网址 https://www.luogu.org/problemnew/show/U32670 题目背景 NOIP2018 原创模拟题T1 NOIP DAY1 T1 or DAY 2 T1 难度 ...

  7. python第一个程序-->hello world

    最近在网上看到一个小笑话,一个程序员的自我嘲讽:“我精通所以计算机语言的hello world!” 好了,废话不多说了,开始撸代码: 我本人用的是python3.6版本,各位可以通过官网下载自己喜欢的 ...

  8. php之apc浅探

    扩展编译: ./configure --enable-apc --with-php-config=/usr/local/php/bin/php-config --prefix=/usr/local/a ...

  9. MediaTypeListWidget->insertItem 添加的label没有填充单元格

    label没有填充满当前的item,但是主界面拉伸或者大小变化之后会填充当前的item 类似相关的问题我猜测都是因为子控件或者需要参考的控件的参考对象的大小在初始化的时候还没有完成最终的初始化,导致大 ...

  10. 云计算之路-阿里云上:“黑色1秒”问题与2009年Xen一个补丁的故事

    在之前对“黑色1秒”问题的分析博文中,我们将最大嫌疑对象锁定在了Xen,在这篇博文我们将从Xen的角度进行分析.也许有人会问,为什么不知道天多高地多厚地去研究不属于自己范围的问题?只因我们对一个问题的 ...