352
A - AtCoder Line
AtCoder 铁路线有
在这条线路上,有趟进站列车从
高桥站即将从
求这趟列车在
void solve() {
int n, x, y, z;cin >> n >> x >> y >> z;
if (z <= y && z >= x || z <= x && z >= y) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
B - Typing
高桥尝试使用键盘输入由小写英文字母组成的字符串
他打字时只看键盘,不看屏幕。
每当他错误地输入一个不同的小写英文字母时,他就立即按下退格键。然而,退格键被破坏了,因此误键入的字母没有被删除,实际键入的字符串是
他没有误按小写英文字母以外的任何键。
确定正确键入的字符在
void solve() {
string s, t;cin >> s >> t;s = ' ' + s;t = ' ' + t;
int j = 1;
for (int i = 1;i < t.size();i++) {
if (t[i] == s[j]) {
cout << i << " ";j++;
}
}
}
C - Standing On The Shoulders
有
你可以选择
-
首先,将
巨人放在地上。巨人 的肩膀距离地面的高度为 ,头部距离地面的高度为 。 -
为了
的顺序,要把巨人 放在巨人 的肩膀上。如果巨人 的肩膀距离地面的高度是 ,那么巨人 的肩膀距离地面的高度就是 ,他们的头距离地面的高度就是 。
求最上面的巨人
#define int long long
void solve() {
int n;cin >> n;;
int sum = 0, mx = -1, ans = 0;
for (int i = 1;i <= n;i++) {
int x, y;cin >> x >> y;sum += y;sum -= y - x;
mx = max(mx, y - x);
}
cout << sum + mx << '\n';
}
D - Permutation Subsequence
给你一个
如果一个索引序列
. - 子序列
可以通过重新排列一些连续的 整数得到。
形式上,存在一个整数,使得 .
求所有好的索引序列中
按照
排列从 到 的所有可能中取最小值即可。有点滑动窗口的意思了。
void solve() {
int n, k;cin >> n >> k;vector<int> mp(n + 1);
for (int i = 1;i <= n;i++) {
int x; cin >> x; mp[x] = i;
}
set<int> s;
for (int i = 1;i <= k;i++) {
s.insert(mp[i]);
}
int ans = *s.rbegin() - *s.begin();
for (int i = k + 1;i <= n;i++) {
s.erase(mp[i - k]);
s.insert(mp[i]);
ans = min(ans, *s.rbegin() - *s.begin());
}
cout << ans << '\n';
}
E - Clique Connect
给你一个加权无向图
您将执行
- 给你一个由
个顶点组成的顶点子集 。对于每一对 ,即 和 ,在顶点 和 之间添加一条边,权重为 。
完成所有
Solution
最小生成树/Prim/Kruskal
最小生成树板题。
小技巧:这里如果暴力读入会超时,只要一个点与后面的点依次连接不影响结果
Prim
#define int long long
void solve() {
int n, m;cin >> n >> m;
vector<vector<pair<int, int>>>g(n + 1);
while (m--) {
int k, c;cin >> k >> c;
int h;cin >> h;
for (int i = 1;i < k;i++) {
int x;cin >> x;
g[h].push_back({x,c});
g[x].push_back({h,c});
}
}
int ans = 0, cnt = 0;
vector<int> d(n + 1, 1e18), vis(n + 1);
priority_queue<pair<int, int>>q;
d[1] = 0;q.push({0,1});
while (q.size()) {
auto u = q.top().second;q.pop();
if (vis[u])continue;
vis[u] = 1;
ans += d[u];cnt++;
for (auto [v, w] : g[u]) {
if (d[v] > w) {
d[v] = w;q.push({-d[v],v});
}
}
}
if (cnt == n){
cout << ans << '\n';
} else {
cout << "-1\n";
}
}
Kruskal
#define int long long
int f[200010];
int find(int x) {
if (f[x] == x)return x;
return f[x] = find(f[x]);
}
void solve() {
int n, m;cin >> n >> m;
for (int i = 1;i <= n;i++)f[i] = i;
vector<array<int, 3>> g;
for (int i = 1;i <= m;i++) {
int k, c;cin >> k >> c;
int h;cin >> h;
for (int i = 1;i < k;i++) {
int x;cin >> x;
g.push_back({h,x,c});
}
}
sort(g.begin(), g.end(), [&](auto x, auto y) {
return x[2] < y[2];
});
int ans = 0, cnt = 0;
for (int i = 0;i < g.size();i++) {
int u = find(g[i][0]), v = find(g[i][1]);
if (u == v)continue;
ans += g[i][2];f[u] = v;
if (++cnt == n - 1)break;
}
if (cnt != n - 1) {
cout << "-1\n";
} else {
cout << ans << '\n';
}
}
F - Estimate Order
有
在这些
- 每个人都有一个唯一的排名。
- 对于每个
,如果 的排名是 -th,而 的排名是 -th,那么就是 。
给定的输入保证了至少有一种可能的排名与给定的信息不矛盾。
回答
- 如果可以唯一确定人
的排名,则返回该排名。否则,返回 。
Solution
(待更