Codeforces Round 915 (Div. 2)

1|0基本情况

A题还没进入状态,卡了快10分钟。

B题一开始想复杂了,以为是树的直径,后面推出来发现针对叶子数目讨论就行了,正确思路出来太慢了(一个半小时)。

C题留了半个多小时,随便口胡了一个LIS思路,但是判断无解没思路。

2|0C. Largest Subsequence

Problem - C - Codeforces

首先我们把字典序最大的子序列找出,方法就是从大到小枚举每个字母,然后能加就加入.

然后我们可以发现我们能做的只有对这个子序列排序,每次循环位移之后一定是把子序列最后的字符(最小的字符)放到最前面,然后相当于把这个字符从子序列里删掉了.

所以我们只需要判断把这个序列排序后能否使得原序列有序即可.

操作次数是子序列除了最大的字符以外的其他字符的数量.

void solve() { int n; std::string s; std::cin >> n >> s; std::vector<std::vector<int> > pos(26); for(int i = 0; i < n; i++) pos[s[i] - 'a'].push_back(i); std::vector<int> p; int mx = -1; int cnt = 0; for(int i = 25; i >= 0; i--) { auto it = upper_bound(pos[i].begin(), pos[i].end(), mx); p.insert(p.end(), it, pos[i].end()); if (cnt == 0) cnt = p.size(); if (!p.empty()) mx = p.back(); } auto q = p; std::sort(q.begin(), q.end(), [&](int x, int y){return s[x] < s[y];}); std::string t = s; for(int i = 0; i < p.size(); i++) t[p[i]] = s[q[i]]; if (!std::is_sorted(t.begin(), t.end())) std::cout << -1 << '\n'; else std::cout << p.size() - cnt << '\n'; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17909870.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示