G. XOUR

news/2025/3/12 15:24:04/

题目链接:Problem - G - Codeforces

题目大意:给你一个n长的序列, 其中你可以将a[i]  XOR a[j] 的值 严格小于4的数对进行交换。 你可以操作任何几次, 让最后的数列最小。如果在 x 和 y 不同的第一个位置, xi<yi ,那么数组 x 在词法上比数组 y 小。  具体题目见链接。

输入:

第一行包含一个整数 t ( 1≤t≤1e4 ) - 测试用例数。

每个测试用例的第一行包含一个整数 n (1≤n≤2⋅1e5 ) - 数组的长度。

每个测试用例的第二行包含 n 个整数 ai ( 0≤ai≤1e9 ) - 数组的元素。

保证所有测试用例中 n 的总和不超过 2⋅1e5 

考察知识点:                     并查集, 容器map的使用,位运算(a^b==c   c^b==a)。

1.首先可以交换的条件可以看出, 我们可以将 可以交换的数字放在一起,有此功能的算法,不难想到并查集, 然后为了方便使用 并 可以方便取出数据, 采用map, 收集。

2.可以合并的条件:两数 XOR < 4 , 此处, 暴力枚举 0,1,2,3 XOR回取在map里查找是否出现了该数, 如果出现,将该数的下标与次数合并。  最后在到map里标记次数,记录下标。

3. 在并查集使用完过后, 又采用 map<int, multiset<int>> q; 收集每一个下标上的值, 方便在于最后的重新赋值。 利用了multiset的自动排序不去重。 q的键实质上就是每个联通块的根。

#include<bits/stdc++.h>
using namespace std;using i64 = long long;
using i128 = __int128;const int N = 2e5+9;
int tr[N];
int n;
void innt(){for(int i=0; i<n; i++) tr[i] = i;
}//并查集
int find(int x) {if(tr[x] != x) {tr[x] = find(tr[x]);}return tr[x];
}
void mger_(int a, int b){a = find(a);b = find(b);if(a==b)return;tr[b] = a;
}
map<int,int> mp;
map<int, multiset<int>> q;
void solve(){cin >> n;vector<int> a(n);for(int i=0; i<n; i++) {cin >> a[i];}innt();mp.clear();//初始化q.clear();for(int i=0; i<n; i++) {for(int k=0; k<4; k++) { //枚举0,1,2,3int u = a[i] ^ k;if(mp.count(u)) {mger_(i, mp[u]);}//有就连起来}mp[a[i]] = i;//标记} for(int i=0; i<n; i++) {q[find(i)].insert(a[i]); //分组到q}for(int i=0; i<n; i++) {int u = find(i);a[i] = *q[u].begin();q[u].erase(q[u].begin());//使用过后删除}for(int i=0; i<n; i++) {cout << a[i] << " ";}cout << "\n";
}int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while(t--) {solve();}
}

感谢收看与点赞, 欢迎大佬指正。

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

相关文章

【景区导游——LCA】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; const int M 2 * N; int p[N][18], d[N], a[N]; ll dis[N][18]; //注意这里要开long long int h[N], e[M], ne[M], idx, w[M]; int n, k; void add(int a, int b, …

PCA9685 一款由 NXP Semiconductors 生产的 16 通道、12 位 PWM(脉宽调制)控制器芯片

PCA9685 是一款由 NXP Semiconductors 生产的 16 通道、12 位 PWM&#xff08;脉宽调制&#xff09;控制器芯片&#xff0c;广泛应用于 LED 调光、电机控制、伺服控制等领域。以下是关于 PCA9685 的一些关键特性和应用信息&#xff1a; 主要特性 16 通道 PWM 输出&#xff1a;…

缩位求和——蓝桥杯

1.题目描述 在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。 比如&#xff1a;248153720248153720 把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是 1 位数&#xff0c;得 24814>145 156 56 而…

AI-ISP论文Learning to See in the Dark解读

论文地址&#xff1a;Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…

AI协助探索AI新构型的自动化创新概念

训练AI自生成输出模块化代码&#xff0c;生成元代码级别的AI功能单元代码&#xff0c;然后再由AI组织为另一个AI&#xff0c;实现AI开发AI的能力&#xff1b;用AI协助探索迭代新构型AI将会出现&#xff0c;并成为一种新的技术路线潮流。 有限结点&#xff0c;无限的连接形式&a…

图片导入到ppt之后再打印就糊掉了如何解决?

最近在做一个 p o s t e r poster poster的工作是用 P P T PPT PPT做的&#xff0c;结果从 v i s i o visio visio导入到 P P T PPT PPT中还是高清的&#xff0c;打印就糊掉了&#xff0c;注意如果是导出的话图片还是矢量的&#xff0c;但是由于有纸张的要求&#xff0c;所以必…

3 Yarn

3 Yarn 1. yarn的架构和原理1.1 yarn的基本介绍和产生背景1.2 hadoop 1.0 和 hadoop 2.0 的区别1.3 yarn 集群的架构和工作原理1.4 yarn 的任务提交流程 2. RM和NM的功能介绍2.1 resourceManager基本介绍2.2 nodeManager功能介绍 3. yarn的applicationMaster介绍3.1 applicatio…

使用UpdateCursor删除行

UpdateCursor除了可以编辑表或要素类的行外,还可以删除行.但要记住,在编辑会话外删除行时,更改是永久性的. 操作方法: 1.打开IDLE,新建一个脚本 2.导入arcpy和os模块 import arcpy import os 3.设置工作空间 arcpy.env.workspace "<>" 4.在with语句中新…