Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)

时间:2021-10-20 14:48:05

题目链接


\(Description\)

给定两个长为\(n\)的数组\(x_i,y_i\)。每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\)可以相等)。要求若干次操作后使得\(x\)变成\(y\),输出方案。操作次数不能多于\(10^6\),无解输出\(-1\)。

\(n\leq10^4,\ 0\leq x_i,y_i\leq10^9\)。

\(Solution\)

考虑异或的两个基本性质:

  1. 异或是可逆的,逆运算就是它本身。
  2. 可以交换两个数:a^=b,b^=a,a^=b

考虑线性基。构造出\(x\)的线性基,如果\(y\)中存在元素不能被\(x\)表示出来,那么无解。

我们发现对于不在线性基中的元素\(x_i\),得到\(y_i\)是很容易的,只需要求一下在线性基中\(\mathbb{xor}\)出\(y_i\)需要异或哪些数。

对于在线性基中的元素,设有\(t\)个,它们之间不是很好做。把\(t\)个\(x_i\)对应的\(y_i\)需要\(\mathbb{xor}\)哪些基写成一个\(t\)位二进制数。由第二个性质,我们可以高斯消元将这个\(t\times t\)的矩阵消成一个上三角矩阵,这样从高位到低位做不同基之间就互不影响了,我们可以\(\mathbb{xor}\)出这个矩阵。

而由第一个性质,将高斯消元的过程反过来操作这个上三角矩阵,就可以还原回\(y\)数组。


//46ms	3100KB
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define BIT 29
#define mp std::make_pair
#define pr std::pair<int,int>
#define gc() getchar()
typedef long long LL;
const int N=10005,M=BIT+2; int x[N],y[N],base[M],is_base[N],b[M],sx[M],sy[N];
std::vector<pr> ans,opt; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
} int main()
{
int n=read();
for(int i=1; i<=n; ++i) x[i]=read();
for(int i=1; i<=n; ++i) y[i]=read();
for(int i=1; i<=n; ++i)
{
is_base[i]=-1;
for(int j=BIT,s=0; ~j; --j)
if(x[i]>>j&1)
if(base[j]) x[i]^=x[base[j]], s^=sx[j];
else
{
is_base[i]=j, base[j]=i, sx[j]=s|(1<<j);
break;
}
}
int cnt=0;
for(int i=1; i<=n; ++i)
{
int s=0;
for(int j=BIT; ~j; --j)
if(y[i]>>j&1)
if(base[j]) y[i]^=x[base[j]], s^=sx[j];
else return puts("-1"),0;
if(~is_base[i]) {b[cnt]=i, sy[cnt++]=s; continue;}//可以等于0啊。。
ans.push_back(mp(i,i));
for(int j=BIT; ~j; --j) if(s>>j&1) ans.push_back(mp(i,base[j]));
}
for(int i=0; i<cnt; ++i)
{
int s=sy[i]; sy[i]=0;
for(int j=0; j<cnt; ++j) if(s>>is_base[b[j]]&1) sy[i]|=1<<j;
}
for(int i=0; i<cnt; ++i)
{
if(!(sy[i]>>i&1))
for(int j=i+1; j<cnt; ++j)
if(sy[j]>>i&1)
{
opt.push_back(mp(b[i],b[j]));
opt.push_back(mp(b[j],b[i]));
opt.push_back(mp(b[i],b[j]));
std::swap(sy[i],sy[j]);
break;
}
if(sy[i]>>i&1)
for(int j=i+1; j<cnt; ++j)
if(sy[j]>>i&1)
opt.push_back(mp(b[j],b[i])), sy[j]^=sy[i];
}
for(int i=0; i<cnt; ++i)
{
if(!(sy[i]>>i&1)) ans.push_back(mp(b[i],b[i]));
for(int j=i+1; j<cnt; ++j)
if(sy[i]>>j&1) ans.push_back(mp(b[i],b[j]));
}
std::reverse(opt.begin(),opt.end());
for(auto v:opt) ans.push_back(v);
printf("%d\n",ans.size());
for(auto v:ans) printf("%d %d\n",v.first,v.second); return 0;
}

Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)的更多相关文章

  1. Educational Codeforces Round 63 &lpar;Rated for Div&period; 2&rpar; E 带模高斯消元

    https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...

  2. Codeforces Gym10008E Harmonious Matrices(高斯消元)

    [题目链接] http://codeforces.com/gym/100008/ [题目大意] 给出 一个n*m的矩阵,要求用0和1填满,使得每个位置和周围四格相加为偶数,要求1的数目尽量多. [题解 ...

  3. Codeforces 832E Vasya and Shifts - 高斯消元

    题目传送门 快速的传送门I 快速的传送门II 题目大意 (题意比较复杂,请自行阅读原题) 可以将原题的字母都看成它们的在字符表中的下标,这样问题就变成给定$n$个$m$维向量$\vec{a_{1}}, ...

  4. Codeforces Round &num;114 &lpar;Div&period; 1&rpar; E&period; Wizards and Bets 高斯消元

    E. Wizards and Bets 题目连接: http://www.codeforces.com/contest/167/problem/E Description In some countr ...

  5. CodeForces 24D Broken robot(期望&plus;高斯消元)

    CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...

  6. Codeforces 1163E 高斯消元 &plus; dfs

    题意:给你一个集合,让你构造一个长度尽量长的排列,使得排列中任意相邻两个位置的数XOR后是集合中的数. 思路:我们考虑枚举i, 然后判断集合中所有小于1 << i的数是否可以构成一组异或空 ...

  7. Broken robot CodeForces - 24D (三对角矩阵简化高斯消元&plus;概率dp)

    题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...

  8. Codeforces 446D - DZY Loves Games(高斯消元&plus;期望 DP&plus;矩阵快速幂)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...

  9. Educational Codeforces Round 58 &lpar;Rated for Div&period; 2&rpar; G 线性基

    https://codeforces.com/contest/1101/problem/G 题意 一个有n个数字的数组a[],将区间分成尽可能多段,使得段之间的相互组合异或和不等于零 题解 根据线性基 ...

随机推荐

  1. The calculation of GPA

    Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计算GPA(grade point average) 又称GPR(g ...

  2. Spring Controller参数为空串的处理方式

    控制器参数为String类型 Spring框架接收到传入的空串后,此参数被赋值为空串,不为null. 控制器参数为非String类型 Spring框架接收到传入的空串后,此参数被赋值为null.

  3. JVM -XX&colon; 参数介绍(转)

    垃圾回收器相关常用参数: 功能开关: 参数 默认值或限制 说明 参数 默认值 功能 -XX:-AllowUserSignalHandlers 限于Linux和Solaris,默认不启用 允许为java ...

  4. sharepoint 模糊搜索

    看资料知道sharepoint中模糊搜索可以用FullTextSqlQuery,因此我们就可以业务需求进行模糊搜索的自定义开发,可惜前一段时间自己写了一个模糊搜索,发现了一个问题,暂不知道如何过滤管理 ...

  5. Git本地项目上传 &amp&semi; SourceTree &amp&semi; GitHub 简单使用

    Git(分布式版本控制系统) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理 ...

  6. &lpar;实用篇&rpar;使用PHP生成PDF文档

    http://mp.weixin.qq.com/s?__biz=MzIxMDA0OTcxNA==&mid=2654254929&idx=1&sn=8715d008d19af70 ...

  7. Quartz&period;net 3&period;x使用总结&lpar;二&rpar;——Db持久化和集群

    上一篇简单介绍了Quartz.net的概念和基本用法,这一篇记录一下Quartz.net通过数据库持久化Trigger和Jobs等数据,并简单配置Quartz.net的集群. 1.JobStore介绍 ...

  8. BZOJ3881&lbrack;Coci2015&rsqb;Divljak——AC自动机&plus;树状数组&plus;LCA&plus;dfs序&plus;树链的并

    题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  9. 查看app日志的方法

    可以打开SDk里面的 ddms.bat 查看日志 路径: android-sdk-macosx/tools/ddms SDK下载的地址: http://www.androiddevtools.cn/ ...

  10. oracle创建透明网关出现的问题

    解决方案:创建HS_TRANSACTION_LOG表 DROP TABLE HS_TRANSACTION_LOG go CREATE TABLE HS_TRANSACTION_LOG( GLOBAL_ ...