比赛链接:Here

AB水题,跳过


C - Swappable

在数组中找到满足条件的数对 \((i,j)\)

  • \(1 \le i < j \le N (N\in[2,3e5])\)
  • \(A_i \not= A_j\)

一道经典利用 map 减少搜索规模的题,

先假设每个数互不相同:ans = n * (n - 1) / 2

map 存每个数出现的次数,然后减去相同的情况 ans -= x * (x - 1) / 2

【AC Code】

void solve() {
ll n;
cin >> n;
ll ans = n * (n - 1) / 2;
map<ll, ll>mp;
for (int i = 1; i <= n; ++i) {
ll x; cin >> x;
mp[x]++;
}
for (auto x : mp)
ans -= x.second * (x.second - 1) / 2;
cout << ans;
}

D - KAIBUNsyo

在数组 \(A\) 中有 \(n\) 个正整数,给定一种操作:

  • 选择 \(x\) 和 \(y\) ,将数组中全部 \(x\) 替换为 \(y\)

请问最少次数是多少可以使得数组$A $ 回文


首先一个重要的点:

  • 对于每一个 \(A_i \not= A_{N+1-i}\) 的数对,最终都会被某一个相同的数替代

让我们将其视为连接无向图中顶点 \(A_i , A_{N + 1 − i}\) 之间的边。

然后,我们可以看到以下事实:

  • 对于每个整数对 \((i,j)\) ,如果 \(i\) 和 \(j\) 属于图的同一个连通分量,则 \(i\) 和 \(j\) 都应该用相同的整数代替。

现在,我们如何最小化操作次数以使连通分量中的所有整数都相同?

如果一个连通分量有 \(k\) 个整数,显然我们需要 \(k − 1\) 次或更多次操作才能使它们成为相同的整数。 即目标可以在 \(k-1\) 次替换中实现,如下所述:

在连通分量中固定一个整数,并将连通分量中的所有其他整数更改为固定整数。

因此,该问题的解决方案是(\(A\) 中不同整数的数量)-(图的连通分量的数量)。

有几种方法可以找到这个值; 两种典型的方法是:

  • 对每个连接的组件执行 DFS 或 BFS。\(\mathcal{O}(N)\)
  • 使用并查集。\(\mathcal{O}(N\ log\ N)\)

这里采用 DFS 解决问题

【AC Code】

using G = vector<vector<int>>;
void dfs(int u, vector<bool> &f, G &g) {
if (!f[u]) {return;}
f[u] = false;
for (auto &v : g[u]) dfs(v, f, g);
} void solve() {
int n; cin >> n;
vector<int>a(n);
vector<bool>f(2e5 + 10, false);
G g(2e5 + 10);
int cnt = 0; for (auto &x : a) {
cin >> x;
if (!f[x]) {f[x] = true, cnt++;}
} int p = 0, q = n - 1;
while (p < q) {
g[a[p]].emplace_back(a[q]);
g[a[q]].emplace_back(a[p]);
p++, q--;
} for (int i = 1; i <= 2e5; ++i)
if (f[i]) { cnt--; dfs(i, f, g); } cout << cnt << "\n";
}

F - Interval Game 2

Alice 和 Bob 又在玩游戏了,

他们有 \(N\) 个半开区间 \([L_i,R_i)\) 来进行 Game:

  • Alice 和 Bob 交替进行以下操作,Alice 先行。

    从 \(N\) 个间隔中,选择一个不与任何已选择的间隔相交的间隔。

无法进行操作的玩家失败,其他玩家获胜。

如果两个玩家都以最佳操作,哪个玩家会获胜?


https://drken1215.hatenablog.com/entry/2021/06/19/224100

const int N = 100;
int n;
vector<int>L, R;
vector<vector<int>>dp; int solve(int l = 0, int r = N) {
if (l == r) return 0;
if (dp[l][r] != -1)return dp[l][r]; set<int>s;
for (int i = 0; i < n; ++i) {
if (l <= L[i] and R[i] <= r) {
int tmp = solve(l, L[i]) ^ solve(R[i], r);
s.insert(tmp);
}
} int grundy = 0;
while (s.count(grundy)) ++grundy;
return dp[l][r] = grundy;
} int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
cin >> n;
L.resize(n), R.resize(n);
for (int i = 0; i < n; ++i) {
cin >> L[i] >> R[i];
L[i]--, R[i]--;
}
dp.assign(N, vector<int>(N + 1, -1));
cout << (solve() > 0 ? "Alice\n" : "Bob\n");
}
}

AtCoder ABC 206的更多相关文章

  1. ATCODER ABC 099

    ATCODER ABC 099 记录一下自己第一场AK的比赛吧...虽然还是被各种踩... 只能说ABC确实是比较容易. A 题目大意 给你一个数(1~1999),让你判断它是不是大于999. Sol ...

  2. Atcoder ABC 141

    Atcoder ABC 141 A - Weather Prediction SB题啊,不讲. #include<iostream> #include<cstdio> #inc ...

  3. Atcoder ABC 139E

    Atcoder ABC 139E 题意: n支球队大循环赛,每支队伍一天只能打一场,求最少几天能打完. 解法: 考虑抽象图论模型,既然一天只能打一场,那么就把每一支球队和它需要交手的球队连边. 求出拓 ...

  4. Atcoder ABC 139D

    Atcoder ABC 139D 解法: 等差数列求和公式,记得开 $ long long $ CODE: #include<iostream> #include<cstdio> ...

  5. Atcoder ABC 139C

    Atcoder ABC 139C 题意: 有 $ n $ 个正方形,选择一个起始位置,使得从这个位置向右的小于等于这个正方形的高度的数量最多. 解法: 简单递推. CODE: #include< ...

  6. Atcoder ABC 139B

    Atcoder ABC 139B 题意: 一开始有1个插口,你的插排有 $ a $ 个插口,你需要 $ b $ 个插口,问你最少需要多少个插排. 解法: 暴力模拟. CODE: #include< ...

  7. Atcoder ABC 139A

    Atcoder ABC 139A 题意: 给你两个字符串,记录对应位置字符相同的个数 $ (n=3) $ 解法: 暴力枚举. CODE: #include<iostream> #inclu ...

  8. atcoder abc 244

    atcoder abc 244 D - swap hats 给定两个 R,G,B 的排列 进行刚好 \(10^{18}\) 次操作,每一次选择两个交换 问最后能否相同 刚好 \(10^{18}\) 次 ...

  9. AtCoder ABC 250 总结

    AtCoder ABC 250 总结 总体 连续若干次一样的结果:30min 切前 4 题,剩下卡在 T5 这几次卡在 T5 都是一次比一次接近, 什么 dp 前缀和打挂,精度被卡,能水过的题连水法都 ...

  10. AtCoder ABC 242 题解

    AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...

随机推荐

  1. 一文秒懂|Linux字符设备驱动

    1.前言 众所周知,Linux内核主要包括三种驱动模型,字符设备驱动,块设备驱动以及网络设备驱动. 其中,Linux字符设备驱动,可以说是Linux驱动开发中最常见的一种驱动模型. 我们该系列文章,主 ...

  2. 在Winform应用中增加通用的业务编码规则生成

    在我们很多应用系统中,往往都需要根据实际情况生成一些编码规则,如订单号.入库单号.出库单号.退货单号等等,我们有时候根据规则自行增加一个函数来生成处理,不过我们仔细观察后,发现它们的编码规则有很大的共 ...

  3. LeetCode1786:从第一个节点出发到最后一个节点的受限路径数(dijkstra + 记忆化搜索)

    解题思路:比赛的是没读懂题意,这题求的是起点1到n路径序列数,但是路径序列上的相邻两个点 i, i+1 之间应该满足 i.i+1 到终点的最短路low[i] > low[i+1]. 因此需要先以 ...

  4. 华企盾DSC导致wps个人模式无策略组新建的文件仍然加密

    解决方法:右键wps安装目录手动解密即可(原因:wps模板被加密导致)

  5. 【scikit-learn基础】--『监督学习』之 随机森林回归

    随机森林回归(Random Forest Regression)是一种在机器学习领域广泛应用的算法,由美国科学家 Leo Breiman 在2001年提出.它是一种集成学习方法,通过整合多个决策树的预 ...

  6. Linux集群存储配置

    RH436_EX集群 介绍Linux环境下集群架构,Linux开源集群软件的安装及配置使用,软件与软件之间的组合.实现高可用集群,负载均衡集群;负载均衡.高可用集群与存储集群间的多集群混合架构使用. ...

  7. 使用推测解码 (Speculative Decoding) 使 Whisper 实现 2 倍的推理加速

    Open AI 推出的 Whisper 是一个通用语音转录模型,在各种基准和音频条件下都取得了非常棒的结果.最新的 large-v3 模型登顶了 OpenASR 排行榜,被评为最佳的开源英语语音转录模 ...

  8. 22、Scaffold属性 抽屉菜单Drawer

    在Scaffold组件里面传入drawer参数可以定义左侧边栏,传入endDrawer可以定义右侧边栏.侧边栏默 认是隐藏的,我们可以通过手指滑动显示侧边栏,也可以通过点击按钮显示侧边栏. class ...

  9. SaaS 营销,如何利用 RPA 实现自动化获客?

    大家好,这次给大家带来如何利用 RPA 实现自动化获客. 一.RPA 是什么?难吗? RPA 对大家来说,可能挺陌生的,其实它很简单. Robotic Process Automation(简称 RP ...

  10. react+antd选择框输入

    react+antd选择框输入 const onSearch=(fn,value)=>{ if(value){//这个if无比重要 form.setFieldsValue({"Owne ...