CF1163E Magical Permutation(线性基,构造)
虽然做起来有一点裸……但是就是想不到啊……
首先令 $d_i=p_i\oplus p_{i-1}$,那么 $d_i$ 都是 $S$ 中的数,$a_i=d_i\oplus d_{i-1}\oplus \cdots\oplus d_2$。也就是每个数都能被表示成 $S$ 的某个子集的异或和。
要用 $S$ 表示出 $1$ 到 $2^x-1$ 的所有数(不用考虑 $0$,因为每个数是可以重复用的,可以 $S_i\oplus S_i=0$)。怎么求出最大的 $x$?
其实就是建出线性基,然后最小的没有数的位就是 $x$ 了。为什么?当 $0$ 到 $x-1$ 都有数时是可以表示出所有 $0$ 到 $2^x-1$ 的,而当 $x$ 没有数时无法填第 $x$ 位。
(想用严谨一点的语言的……然而实力不允许……)
然后,求出 $x$ 后如何构造排列?
首先有最原始的想法:DFS,每次 $O(n)$ 枚举下一个数是这一个数异或上啥。肯定不可能过。
然后发现只需要保留线性无关的最大子集(可以在建线性基的过程中就完成),此时肯定还是能表示出全部的数(线性无关的定义)。同时数的个数降到了 $O(\log)$。
看起来还是不能过,但是……它的复杂度是对的!为什么?
DFS 过程中要判断 $vis[x\oplus S[i]]$,这就是在原始想法中耗费大量无用时间的原因。
而出现这样的情况,当且仅当出现了区间异或和为 $0$ 的情况。
但是对于这个线性无关的子集,会出现这样的情况,当且仅当当前枚举的 $S_i$ 等于目前的某一个后缀异或和。因为既然线性无关,所以所有不可重子集的异或和都不为 $0$。
由于 $S_i$ 只有 $O(\log)$ 种,所以也只会有 $O(\log)$ 次无法递归。
那么复杂度就对了。$O(n\log)$。下面的代码实现比较丑,所以复杂度似乎是两个 $\log$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,s[maxn],lb[],vec[],vl,ans,seq[maxn],sl;
bool vis[maxn],ok;
void insert(int x){
int tmp=x;
ROF(i,,) if((x>>i)&){
if(!lb[i]){
lb[i]=x;
vec[++vl]=tmp;
return;
}
else x^=lb[i];
}
}
bool check(int x){
FOR(i,,x-) if(!lb[i]) return false;
return true;
}
void dfs(int x){
vis[x]=true;
seq[++sl]=x;
if(sl==(<<ans)){ok=true;return;}
FOR(i,,vl) if(!vis[x^vec[i]]){
dfs(x^vec[i]);
if(ok) return;
}
vis[x]=false;
sl--;
}
int main(){
n=read();
FOR(i,,n) s[i]=read();
ROF(_,,){
MEM(lb,);MEM(vec,);vl=;
FOR(i,,n) if(s[i]<=(<<_)-) insert(s[i]);
if(check(_)){ans=_;break;}
}
printf("%d\n",ans);
dfs();
FOR(i,,sl) printf("%d ",seq[i]);
}
CF1163E Magical Permutation(线性基,构造)的更多相关文章
- Codeforces 1163E Magical Permutation [线性基,构造]
codeforces 思路 我顺着图论的标签点进去的,却没想到-- 可以发现排列内每一个数都是集合里的数异或出来的. 考虑答案的上界是多少.如果能用小于\(2^k\)的数构造出\([0,2^k-1]\ ...
- CF1163E Magical Permutation【线性基,构造】
题目描述:输入一个大小为\(n\)的正整数集合\(S\),求最大的\(x\),使得能构造一个\(0\)到\(2^x-1\)的排列\(p\),满足\(p_i\oplus p_{i+1}\in S\) 数 ...
- 51Nod1577 异或凑数 线性基 构造
国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...
- CF1163E Magical Permutation
题意:给定集合,求一个最大的x,使得存在一个0 ~ 2x - 1的排列,满足每相邻的两个数的异或值都在S中出现过.Si <= 2e5 解:若有a,b,c,令S1 = a ^ b, S2 = b ...
- BZOJ3569: DZY Loves Chinese II(线性基构造)
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图, ...
- bzoj 4004 [JLOI2015]装备购买 拟阵+线性基
[JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 547[Submit][Status][Dis ...
- Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)
题目链接 \(Description\) 给定两个长为\(n\)的数组\(x_i,y_i\).每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\ ...
- 【HDU 3949】 XOR (线性基,高斯消元)
XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 高斯消元 & 线性基【学习笔记】
高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...
随机推荐
- golang基础之初识
golang 简介 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的 ...
- lego loam 跑镭神32线激光雷达
师弟反应镭神32线激光雷达(32C)录制的数据包不能跑lego loam,这里就总结一下. 首先lego loam默认的接受的topic name是velodyne_points,点云的frame_i ...
- SpringBoot-@ControllerAdvice 拦截异常并统一处理
SpringBoot是为了简化Spring应用的创建.运行.调试.部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可 ...
- 阿里开源 Dragonwell JDK 重磅发布 GA 版本:生产环境可用
今年 3 月份,阿里巴巴重磅开源 OpenJDK 长期支持版本 Alibaba Dragonwell的消息,在很长一段时间内都是开发者的讨论焦点,该项目在 Github 上的 Star 数迅速突破 1 ...
- Python urlib 模块
Python urlib 模块 urlib 模块 当前再爬虫领域使用的比较少,不过它对图片爬取处理会比较方便.这里我们只使用它的图片爬取. 使用 urlib.request.urlretrieve(u ...
- js数组试列题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Java生鲜电商平台-技术方案与文档下载
Java生鲜电商平台-技术方案与文档下载 说明:任何一个好的项目,都应该有好的文档与设计方案,包括需求文档,概要设计,详细设计,测试用例,验收报告等等,类似下面这个图: 有以下几个管理域: 1. 开发 ...
- HTTP Protocol
HTTP协议 1 HTTP请求状态码 当用户试图通过 HTTP 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.状态 ...
- SQL中的视图(极客时间)
视图 视图也就是虚拟表, 本身不具备数据, 是SQL中的一个变红要概念. 如图 视图可以帮助我们使用表的一部分, 而不是所有的表, 另一方面可以针对不同的用户制定不同的查询视图. 创建, 更新与删除视 ...
- 1.说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程?
作者:中华石杉 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原 ...