牛客编程巅峰赛S1第3场 - 黄金&钻石
A、找卧底
题目描述
牛牛今天和大家玩了一个新游戏,除了牛牛以外还有n个人参加游戏,现在这n个人中的每个人从[1,n]中选择一个数字,保证选出的数字均不重复。牛牛作为第n+1个人,充当卧底的角色,要求卧底从1到n中选择一个数字,现在将n+1个数字重新打乱顺序,请找出卧底选择的数字是多少。
备注:
其中1<=n<=100000。
要求时间复杂度为O(n),额外空间复杂度为O(1)
示例1 输入 4,[1,2,1,4,3] 输出 1
解题方法
class Solution {
public:
/**
*
* @param n int整型
* @param a int整型vector
* @return int整型
*/
int cnt[100005];
int search(int n, vector<int>& a) {
// write code here
int ans = 0;
for(auto it:a) ans^=it;
for(int i=1;i<=n;++i) ans^=i;
return ans;
}
}; B、父子情深
/**
* struct Point {
* int x;
* int y;
* };
*/
class Solution {
public:
/**
* 从 1 到 n 每个结点的权值。
* @param n int整型
* @param Edge Point类vector (u, v) 集合
* @param q int整型
* @param Query Point类vector Point.x 为题中 r, Point.y为题中 v
* @return long长整型vector
*/
int fa[100005];
vector<long> dp;
vector<int> e[100005];
void dfs2(int x, int y) {
if(x) dp[x] += dp[y];
for (auto it : e[x]) {
if (it == y) continue;
dfs2(it, x);
}
}
vector<long> solve(int n, vector<Point>& Edge, int q, vector<Point>& Query) {
// write code here
for(int i=0;i<100005;++i) e[i].clear();
for (auto it : Edge) {
e[it.x-1].push_back(it.y-1);
e[it.y-1].push_back(it.x-1);
}
dp.clear();
for(int i=0;i<n;++i) dp.push_back(0);
for (auto it : Query)
dp[it.x-1] += it.y;
dfs2(0, -1);
return dp;
}
}; C、旋转跳跃
/**
* struct Point {
* int x;
* int y;
* };
*/
class Solution {
public:
/**
* 返回牛牛所能得到的字典序最小的排列
* @param n int整型
* @param m int整型
* @param perm int整型vector
* @param Pair Point类vector
* @return int整型vector
*/
int fa[100007], a[100007];
vector<int> e[100007];
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
vector<int> solve(int n, int m, vector<int>& perm, vector<Point>& Pair) {
// write code here
for (int i = 1; i <= n; ++i) a[i] = perm[i-1], fa[i] = i;
for (auto it : Pair) fa[find(it.x)] = find(it.y);
for (int i = 1; i <= n; ++i) e[find(i)].push_back(i);
for (int i = 1; i <= n; ++i) {
vector<int> tmp;
for (auto it : e[i]) tmp.push_back(a[it]);//第i个人掌管的点现在的权值放进去
sort(tmp.begin(), tmp.end());//排序
for (int j = 0; j < e[i].size(); ++j) a[e[i][j]] = tmp[j];//更新
}
vector<int> ans;
for (int i = 1; i <= n; ++i)
ans.push_back(a[i]);
return ans;
}
}; 牛客编程巅峰赛S1 文章被收录于专栏
S1赛季留念
阿里云工作强度 621人发布
