2024ccpc线性基与校赛线性基

news/2025/1/15 17:57:20/文章来源:https://www.cnblogs.com/9102qyy/p/18405987

异或空间线性基

我终于意识到写题解有多重要了

2024 CCPC 网络赛 Problem J. 找最小

Mandy 发现了两个很好玩的长度为\(n\)的序列,记为\(a,b\),她觉得一个序列的无趣度为序列内所有元素的异或和。

现在她想要这两个序列尽可能有趣,具体来说,她希望最无趣的序列尽可能有趣。她觉得交换两个序列中对应位置的元素是无伤大雅的,可以进行任意次这样的操作。

现在她想要知道,最有趣的情况下两个序列无趣度较大者的无趣度是多少呢?

形式化地来说,你有两个长度为 \(n\) 的序列 \(a,b\) ,你可以进行若干次选择一个 \(i\left(1\leq i\leq n\right)\) ,然后交换 \(a_i,b_i\) ,希望使得 \(\max\{f(a),f(b)\}\) 最小,其中对于一个序列 \(A,f(A)=\oplus_i=1^nA_i\) (\(\oplus\)表示按位异或) 。

Output

第一行一个整数 \(T\left ( 1\leq T\leq 10^5\right )\), 表示数据组数。

对于每组数据,第一行一个整数 \(n\) \((1≤n≤10^6)\)

第二行 \(n\) 个整数 \(a_1,a_2,\cdots,a_n\) \((0\leq a_i<2^{31})\)

第三行\(n\)个整数\(b_1,b_2,\cdots,b_n\) \((0\leq b_i<2^{31})\)

保证对于所有数据,\(\sum n\leq10^6\)

Solution

首先有一个重要观察,如果当前两个数组的异或和分别是 \(A\)\(B\), 使得 \(a_i\)\(b_i\) 交换的操作即为

$A\oplus a_i \oplus b_i $ 与 $B\oplus a_i \oplus b_i $

\(c_i = a_i \oplus b_i\) , 在数组 \(c\) 中选择若干个数字异或

于是可以考虑线性基,设异或出的数字为 \(X\)

问题进展到这里,我们对 \(X\) 希望是什么样子的已经可以贪心得到了,从高位到低位贪心。

而线性基刚好异或上这一个,那么这个对应的这一位就在结果中出现,不异或这一个,就不会出现。

接下来就是分类讨论了,当前位若 \(A_i = B_i\) ,则去看线性基有没有这一位再直接选择异或或者不异或,我们可以强制 \(A > B\),不然交换位置。那么第一个出现不同的情况的时候,肯定是 \(A_i = 1 \; \; B_i = 0\) 的情况,这时候我们如果选择异或这一位的话,那么 \(B\) 求出的答案就肯定大于 \(A\) 求出的答案了,所以,之后所有的选择都得偏袒 \(B\)。 相当于(在大的情况下我偏袒了 \(A\),那么在每一个小的情况,我都需要去补偿 \(B\),相反也是一样的)

下面是参考代码

点击查看代码
// Created by qyy on 2024/9/9.#include <bits/stdc++.h>using namespace std;typedef long long ll;#define PII pair<int, int>
#define endl "\n"const long long inf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;int n;
ll a[N], b[N];bool zero;
ll p[N];
int xxjcnt;
int Gauss(){// 此构造线形基出的是降序排序,大小为 xxjcnt 个,编号从 1 开始for(int i = 1; i <= n; i++){p[i] = a[i];}int i, k = 1;ll j = (ll) 1 << 62;  // 注意不是 63;for(; j; j >>= 1){for(i = k; i <= n; i++) {if (p[i] & j) {break; // 找到了第 j 位上的 1}}if(i > n){continue; // 没有找到第 j 位上的 1}swap(p[i], p[k]);for(i = 1; i <= n; i++){if(i != k && p[i] & j){p[i] ^= p[k];}}k++;}k--;if(k != n){zero = true;}else{zero = false;}return k;
}ll toj[100]; // 需要更新;
int cal(ll x){for(int i = 62; i >= 0; i--){if((1LL << i) & x){return i;}}
}void solve() {cin >> n;for(int i = 0; i < 90; i++){toj[i] = 0;}ll A = 0, B = 0;for(int i = 1; i <= n; i++){cin >> a[i];A ^= a[i];}for(int i = 1; i <= n; i++){cin >> b[i];B ^= b[i];}for(int i = 1; i <= n; i++){a[i] ^= b[i];}if(A < B){swap(A, B);}xxjcnt = Gauss();for(int i = 1; i <= xxjcnt; i++){int x = cal(p[i]);toj[x] = p[i];}ll ans1 = 0, ans2 = 0;bool flag = false;for(int i = 62; i >= 0; i--){ll x = (1LL << i);if((x&A) && (!(x&B))){// 开始分类;if(toj[i] != 0){if(flag){ans2 ^= toj[i]; // 应该按照 B 小的走,因为现在 B 异或出来一定比 A 大}else{ans1 ^= toj[i]; // 应该按照 B 小的走,因为现在 B 异或出来一定比 A 大}}flag = true;}else if((x&A) && (x&B)){// 需要 toj[i] 参与进来if(toj[i] != 0){ans1 ^= toj[i];ans2 ^= toj[i];}}else if((!(A&x)) && (!(B&x))){// 不需要任何参与}else{// 给两个答案都计算上if(toj[i] != 0){ans1 ^= toj[i];}}}ll res1 = max(A^ans1, B^ans1);ll res2 = max(A^ans2, B^ans2);cout << min(res1, res2) << endl;
}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while (t--) {solve();}return 0;
}

2024 校赛(团队赛)

作为 xxcdsg 的舔狗,Taibo 经常邀请 xxcdsg 一起玩无聊的游戏。

有一个长度为 \(n\) 的序列 $[a_1,a_2,...,a_n] $ , Taibo 和 xxcdsg 轮流在这个序列中取一个非空子序列并删除该子序列直到序列为空,Taibo 是先手。 游戏结束后,定义游戏的得分为 Taibo 和 xxcdsg 每次所取的子序列的异或和的总和。

现在,Taibo 想要最大化这个得分,而 xxcdsg 则想要最小化该得分。如果双方都采取最佳策略的情况下,最终的得分将是多少?关于非空子序列的定义:如果正整数 \(i_1,i_2,...,i_k(k\geq1)\) 满足\(1\leq i_1<i_2<...<i_k\leq n\), 那么 \([a _{i_1},a_{i_2},...,a_{i_k}]\)\([a_1,a_2,...,a_n]\) 的一个非空子序列。

例如,[1,2,6],[1,3,5],[4],[1,3,5,2,4,6]是[1,3,5,2,4,6]的非空子序列,而[1,2,3],[4,5],[1,2,3,4,5,6]不是。

\(n\leq2\times10^5,0\leq a_i<2^{20}\)

solution

首先一个重要观察,不管 Taibo 第一轮选了什么,剩下的所有数 xxcdsg 一定会全部全部拿光。原因即异或是不进位加法,\(a \oplus b \leq a + b\) ,于是问题简化为在一个数组中选择若干个数异或,加上剩余的数异或,求最大结果。

观察到数据范围,线性基后,可以搜索出每一种可能,于是枚举取最大值就行了。

参考代码如下:


<details>
<summary>点击查看代码</summary>

// Created by qyy on 2024/9/9.

include <bits/stdc++.h>

using namespace std;

typedef long long ll;

define PII pair<int, int>

define endl "\n"

const long long inf = 0x3f3f3f3f3f3f3f3f;
const int N = 2e5 + 10;
const int mod = 7;

int n;
ll a[N];

bool zero;
ll p[N];
int xxjcnt;
int Gauss(){
// 此构造线形基出的是降序排序,大小为 xxjcnt 个,编号从 1 开始
for(int i = 1; i <= n; i++){
p[i] = a[i];
}
int i, k = 1;
ll j = (ll) 1 << 62; // 注意不是 63;
for(; j; j >>= 1){
for(i = k; i <= n; i++) {
if (p[i] & j) {
break; // 找到了第 j 位上的 1
}
}
if(i > n){
continue; // 没有找到第 j 位上的 1
}
swap(p[i], p[k]);
for(i = 1; i <= n; i++){
if(i != k && p[i] & j){
p[i] ^= p[k];
}
}
k++;
}
k--;
if(k != n){
zero = true;
}else{
zero = false;
}
return k;
}

ll ans = 0, sum = 0;
void dfs(int pos, ll cur){
if(pos == xxjcnt + 1){
ans = max(ans, cur + (sum^cur));
return ;
}
dfs(pos + 1, cur);
cur ^= p[pos];
dfs(pos + 1, cur);
}
void solve() {
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
sum ^= a[i];
}
xxjcnt = Gauss();
ans = sum;
dfs(1, 0);
cout << ans << endl;
}

signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}

</details>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794853.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08 Windows批处理之执行编译后的程序

本文是关于一个bat文件执行或调用另一种语言编写和编译的程序。实际上,这样做的语法非常简单。本文最有趣的方面是,有时正在执行的程序在bat文件中没有定义路径。bat文件如何找到可执行文件? 本文的主要重点将放在查找此类程序的两个非常重要的机制上,即当前目录和路径变量…

工地安全带识别系统

高处工地安全带识别系统选用目前的视频监控系统系统,纪录高清图像。依据图像检测,工地现场作业人员的工地安全带识别系统将识别工作人员是不是系好安全带,如果没有则立刻报警提醒。施工工地安全带识别:安全带识别系统高处作业安全带识别。高处工地安全带识别系统选用目前的…

91卫图内存不能为written

91卫图出现报错,报错信息如下:解决方法: 把91卫图助手软件目录下面的layer.bin改成layer1.bin,然后再打开软件 打开以后,图层管理器, 右键“我的图层”,点击还原所有图层,选择最早的一个时间点还原

apisix~kafka-logger插件

作用 将http请求与响应的内容发到kafka的topic,以json的形式发送存储 配置相关log_format为自定义配置字段,添加后,默认的请求响应消息将被覆盖{"_meta": {"disable": false},"batch_max_size": 1,"brokers": [{"host": …

安装mayavi命令,使用cxfreeze打包python脚本

pip install numpy出现A new release of pip is available: 23.2.1 -> 24.2 输入: python -m pip install --upgrade pip setuptools wheelpip install PyQt5pip install vtk pip install mayavi pip install scipypip install configobj 查看当前项目的依赖包:pip freeze…

工控机的重要技术:架构与功能

随着工业自动化的快速发展,工控机作为现代工业系统的重要组成部分,其核心技术的研究和应用愈发引起了各界的广泛关注。工控机,作为一种专门用于工业控制和监测的计算机系统,其架构与功能的有效设计和实现直接关系到工业生产的效率与安全。本文将从工控机的基本架构、核心功…

Kubernetes怎么进行NFS动态存储迁移

环境查看 系统环境# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # uname -a Linux CentOS7K8SMaster01063 3.10.0-1160.108.1.el7.x86_64 #1 SMP Thu Jan 25 16:17:31 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux软件环境 # kubectl version Client Version…

Flutter provider和 getx 区别

前沿 Provider 和 GetX 是 Flutter 社区中常用的两种状态管理解决方案。 它们各自有不同的特点和使用场景,下面是它们的区别和示例,以便更好地理解和选择适合的状态管理方法。示例:Provider 和 GetX 的使用 1. 使用 Provider 的示例 假设我们有一个简单的计数器应用,点击按…

NVIDIA驱动,CUDA,CONDA环境安装

NVIDIA驱动安装检查驱动信息last rebootuname -rcat /var/log/apt/history.lognvidia-smill /usr/src/lsmod |grep nvidialspci |grep -i nvidiadmesg -i |grep nvidiadmesg |grep -i nvidiadmesg |grep -i nvrm dpkg --get-selections | grep linux-image查看加载内核版本zg…

一觉醒来,Qt、C#界面开发的天塌了?

再算上VC、PyQt,之前说“人生苦短,快用python”,现在要说人生苦短,快跳出泥潭!上位机、客户端界面传统开发太重,也不够美。传统开发中,还算不错的 毕竟大部分场景,界面并不是核心。大量时间精力投入在交互、美观、还有各种界面类“面向对象的封装”上,实在不划算。有指…

Linguistics-English-时态16种:4种时间4种状态 + 16种时态详解 + 8种时态的被动语态

时态16种: 4种时间 4种状态时态标志词 + 时态详解 + 8种语态的被动语态:

雨量监测系统需要哪些设备,带你360度无死角了解雨量监测系统

作为星创易联技术支持林工,我很高兴为大家介绍我们公司的雨量监测系统。在过去的几年里,我亲自参与了多个雨量监测项目的设计、部署和维护工作,积累了丰富的实践经验。今天,我将详细介绍我们的雨量监测系统,包括其组成部分、工作原理、应用场景以及部署注意事项。有兴趣的…