题解 2020.10.24 考试 T2 选数
题目大意
见题面。
思路
本来以为zcx、pxj变强了,后来发现是SPJ出问题了。。。考试的时候感觉有点人均啊。。。结果自己还是只想出来一半。
我们假设 \(f(x)=(\lfloor\frac{2x}{2^n}\rfloor+2x)\pmod{2^n}\),那么我们可以看出 \(f(x)\) 实际上就是 \(x\) 把第一位提到最后一位,那么我们就可以想到 \(f(a\otimes b)=f(a)\otimes f(b)\)(虽然我考试的时候就是这里没有想到)。
考虑原问题,我们不难看出,答案就是:
\]
\]
然后我们把 \(f(\text{pre}(i))\otimes \text{suf}(i+1)\) 放到 trie 树上面跑 dfs 就好了。
时间复杂度 \(\Theta(nm)\) 。
\(\texttt{Code}\)
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define MAXN 100005
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int n,m,a[MAXN],suf[MAXN],pre[MAXN];
int f (int x){return (x * 2 + (x * 2) / (1 << n)) % (1 << n);}
int cnt = 1,ch[MAXN * 30][2];
void ins (int x){
	int now = 1;
	for (Int i = n - 1;~i;-- i){
		int k = x >> i & 1;
		if (!ch[now][k]) ch[now][k] = ++ cnt;
		now = ch[now][k];
	}
}
int dp[MAXN * 30];
int dfs (int now,int len){
	if (len < 0) return 0;
	if (dp[now]) return dp[now];
	int res = 0;
	if (!ch[now][1] && ch[now][0]) res = dfs (ch[now][0],len - 1) + (1 << len);
	else if (!ch[now][0] && ch[now][1]) res = dfs (ch[now][1],len - 1) + (1 << len);
	else{
		res = max (res,dfs (ch[now][0],len - 1));
		res = max (res,dfs (ch[now][1],len - 1));
	}
	return dp[now] = res;
}
int query (int now,int len,int s){
	if (len < 0) return 0;
	int k = s >> len & 1;
	if (ch[now][k]) return query (ch[now][k],len - 1,s);
	else return query (ch[now][!k],len - 1,s) + (1 << len);
}
unordered_map <int,bool> vis;
signed main(){
	read (n,m);
	for (Int i = 1;i <= m;++ i) read (a[i]),pre[i] = pre[i - 1] ^ f (a[i]);
	for (Int i = m;i >= 1;-- i)	suf[i] = suf[i + 1] ^ a[i];
	for (Int i = 0;i <= m;++ i) ins (pre[i] ^ suf[i + 1]);
	int ans = dfs (1,n - 1),res = 0;
	for (Int i = 0;i <= m;++ i){
		int stx = ans ^ pre[i] ^ suf[i + 1];
		if (!vis[stx] && query (1,n - 1,stx) == ans) vis[stx] = 1,res ++;
	}
	write (ans),putchar ('\n'),write (res),putchar ('\n');
	return 0;
}
题解 2020.10.24 考试 T2 选数的更多相关文章
- 题解 2020.10.24 考试 T3 数列
		题目传送门 题目大意 给出一个数 \(n\),你要构造一个数列,满足里面每个数都是 \(n\) 的因子,且每一个数与前面不互质的个数不超过 \(1\).问有多少种合法方案. 保证 \(n\) 的不同质 ... 
- 题解 2020.10.24 考试 T4 模板
		题目传送门 题目大意 有一个 \(n\) 个点组成的树,有 \(m\) 次操作,每次将 \(1\to x\) 的路径上每个点都加入一个颜色为 \(c\) 的小球.但是每个点都有大小限制,即小球个数超过 ... 
- 10.24考试题解qwq
		考点难度都很合适的一套题目,大概在day1到day2之前 T1 猴猴最喜欢在树上玩耍,一天猴猴又跳上了一棵树,这棵树有N个苹果,每个苹果有一个编号,分别为0~N-1,它们之间由N-1个树枝相连,猴猴可 ... 
- 题解【2.23考试T2】str
		2. str [题目描述] 这是一道传统题,源代码的文件名为 str.cpp/c/pas. 构造 n 个 01 字符串 S1...Sn,使得对于任意 i≠j,Si 不是 Sj 的前缀.在最小化串长和的 ... 
- 2020.10.24【普及组】模拟赛C组 总结
		T1:暴力 1:先从 6 个中选三个,再把选出的三个全排列,全排列后再判断是否可行 2:把 6 个全都全排列,然后判断 T2:判断误差 1:减法时结果加上 1e-8 2:把小数乘上 1e6 左右 考试 ... 
- 2020.10.17 JZOJ 提高B组T2 导弹拦截
		2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ... 
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
		luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ... 
- luoguP1036 选数 暴力AC题解
		luoguP1036 选数 暴力AC题解(非正解) 俗话说得好:暴力出奇迹,打表拿省一. 对于一些暴力就能拿分的题,暴力就好啦QWQ 题目描述 输入格式 输出格式 输入输出样例 定义变量 我们令输 ... 
- NOIP2018赛前停课集训记(10.24~11.08)
		前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ... 
随机推荐
- flex布局中flex属性运用在随机发红包的算法上
			flex布局是现在前端基本上都会运用的一种布局,基本上用到比较多的是父元素设置display:flex,两个子元素,一个设置固定宽度,另一个设置为flex:1(这里都指flex-direction为r ... 
- python matplotlib 绘图+显示数值
			参考:https://www.jb51.net/article/152685.htm 用plt.text函数 import numpy as np import matplotlib.mlab as ... 
- 浅谈C#更改令牌ChangeToken
			前言 在上篇文章浅谈C#取消令牌CancellationTokenSource一文中我们讲解了CancellationTokenSource,它的主要功能就是分发一个令牌,当我取消令牌我可以进行一些回 ... 
- 致敬mentohust,路由器使用Socket认证华科校园网
			致敬mentohust,路由器使用Socket认证华科校园网 前言: 上一篇文章中,为了解决ESP32华科无线网认证的问题,我成功把网页认证机制用Python+Socket复现.但痛点依然存在,无线网 ... 
- Java基础(一)——面向对象
			一.对象 1.成员变量和局部变量的区别 两类变量同名时,局部变量具有更高的优先级. 作用域不同:局部变量的作用域仅限于定义它的方法,作用于函数或者语句中:成员变量的作用域在整个类中. 初始值不同:Ja ... 
- MySQL——SQL语句入门
			1.DDL: 数据库定义语言 定义对象:库.表 何为定义: 库的定义: 创建 删除 修改---->修改本身以及库中的对象(表.视图.函数.触发器...) 表的定义: 创建---->定义表的 ... 
- [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎
			[源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎 目录 [源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎 0x00 摘要 0x01 前言 1.1 ... 
- 模拟9:T1:斐波那契
			Description: 题目描述: 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行繁衍:一对兔子从出生后第二个月起,每个月刚开 ... 
- 命令行解析函数:getopt_long、getopt
			一.前言 在学习一些项目代码时,尤其涉及到命令行传参的代码,经常遇到getopt相关的函数,对这一类函数可以说是既陌生又熟悉.陌生是因为不知道它是干啥的,熟悉呢,是因为经常遇到.于是乎在追踪了多天ip ... 
- github上使用C语言实现的线程池
			网上介绍线程池的知识很多,但是在代码实现上介绍的又不是那么多.而且给人的一种感觉就是:你的这种实现是正规的方式还是你自己的实现? 如果有这么个疑问,且想找一个靠谱的代码拿来使用,那么这个项目是个不错的 ... 
