天梯赛L2题解(025-028)
L2-025 分而治之
记录度数就行,度数为0就孤立了
#include <bits/stdc++.h>
using namespace std;
#define int long long
void ylh_() {
int n, m;
cin >> n >> m;
vector<vector<int>> g(n + 1);
vector<int> d(n + 1);
for (int i = 1; i <= m; ++i) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
++d[u];
++d[v];
}
int q;
cin >> q;
while (q--) {
int t;
cin >> t;
vector<int> des(n + 1, 0);
vector<int> deg = d;
for (int i = 1; i <= t; ++i) {
int u;
cin >> u;
des[u] = 1;
for (auto v : g[u]) {
--deg[v];
}
}
int f = 1;
for (int i = 1; i <= n; ++i) {
if (!des[i]) {
if (deg[i] > 0) {
f = 0;
}
}
}
if (f) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) {
ylh_();
}
}
L2-026 小字辈
是不是bfs好一点,我这里用的dfs,无所谓了
#include <bits/stdc++.h>
using namespace std;
#define int long long
void ylh_() {
int n;
cin >> n;
vector<vector<int>> g(n + 1);
int rt = 0;
for (int i = 1; i <= n; ++i) {
int f;
cin >> f;
if (f == -1) {
rt = i;
continue;
}
g[f].push_back(i);
}
int mxdep = 1;
vector<int> ans;
auto dfs = [&](auto&& dfs, int u, int dep) -> void {
if (dep == mxdep) {
ans.push_back(u);
}
if (dep > mxdep) {
ans.clear();
mxdep = dep;
ans.push_back(u);
}
for (auto v : g[u]) {
dfs(dfs, v, dep + 1);
}
};
dfs(dfs, rt, 1);
sort(ans.begin(), ans.end());
cout << mxdep << '\n';
for (int i = 0; i < ans.size(); ++i) {
cout << ans[i];
if (i != ans.size() - 1) {
cout << ' ';
}
}
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) {
ylh_();
}
}
L2-027 名人堂与代金券
排个序输出就行了
#include <bits/stdc++.h>
using namespace std;
#define int long long
void ylh_() {
int n, g, k;
cin >> n >> g >> k;
vector<pair<string, int>> a(n + 1);
int ans = 0;
for (int i = 1; i <= n; ++i) {
cin >> a[i].first >> a[i].second;
if (a[i].second >= g) {
ans += 50;
} else if (a[i].second >= 60) {
ans += 20;
}
}
cout << ans << '\n';
sort(a.begin() + 1, a.end(), [&](pair<string, int> x, pair<string, int> y) {
if (x.second == y.second)
return x.first < y.first;
return x.second > y.second;
});
int rank = 1;
a[0] = { "fkxqsvivo50", a[1].second };
for (int i = 1; i <= n; ++i) {
if (a[i].second != a[i - 1].second) {
rank = i;
}
if (rank > k)
break;
cout << rank << ' ' << a[i].first << ' ' << a[i].second << '\n';
}
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) {
ylh_();
}
}
L2-028 秀恩爱分得快
写完发现有点啰嗦,但是能过就行,要注意-0这个点,编号为0的可能是女孩子
#include <bits/stdc++.h>
using namespace std;
#define int long long
const double EPS = 1e-5;
void ylh_() {
int n, k;
cin >> n >> k;
vector<int> sex(n + 1);
vector<vector<int>> p(k + 1);
for (int i = 1; i <= k; ++i) {
int m;
cin >> m;
p[i].resize(m + 1);
p[i][0] = m;
for (int j = 1; j <= m; ++j) {
string s;
cin >> s;
int num = 0;
if (s[0] == '-') {
for (int l = 1; l < s.length(); ++l) {
num *= 10;
num += s[l] - '0';
}
sex[num] = 0;
} else {
for (int l = 0; l < s.length(); ++l) {
num *= 10;
num += s[l] - '0';
}
sex[num] = 1;
}
p[i][j] = num;
}
}
int x, y;
cin >> x >> y;
x = abs(x), y = abs(y);
vector<double> px(n);
vector<double> py(n);
double max_x = 0, max_y = 0;
for (int i = 1; i <= k; ++i) {
int pos = -1;
for (int j = 1; j <= p[i][0]; ++j) {
if (p[i][j] == x) {
pos = j;
}
}
if (pos == -1) {
continue;
}
for (int j = 1; j <= p[i][0]; ++j) {
int v = p[i][j];
if (sex[v] == sex[x])
continue;
px[v] += 1.0 / p[i][0];
max_x = max(px[v], max_x);
}
}
for (int i = 1; i <= k; ++i) {
int pos = -1;
for (int j = 1; j <= p[i][0]; ++j) {
if (p[i][j] == y) {
pos = j;
}
}
if (pos == -1) {
continue;
}
for (int j = 1; j <= p[i][0]; ++j) {
int v = p[i][j];
if (sex[v] == sex[y])
continue;
py[v] += 1.0 / p[i][0];
max_y = max(py[v], max_y);
}
}
auto equal = [](double x, double y) -> bool {
return (abs(x - y) <= EPS);
};
auto print = [&](int x) -> void {
if (sex[x] == 0) {
cout << '-' << x;
} else {
cout << x;
}
};
if (equal(max_x, px[y]) && equal(max_y, py[x])) {
print(x);
cout << ' ';
print(y);
return;
}
vector<int> ansx, ansy;
for (int i = 0; i < n; ++i) {
if (sex[x] != sex[i] && equal(max_x, px[i])) {
ansx.push_back(i);
}
}
for (int i = 0; i < n; ++i) {
if (sex[y] != sex[i] && equal(max_y, py[i])) {
ansy.push_back(i);
}
}
for (int i = 0; i < ansx.size(); ++i) {
print(x);
cout << ' ';
print(ansx[i]);
cout << '\n';
}
for (int i = 0; i < ansy.size(); ++i) {
print(y);
cout << ' ';
print(ansy[i]);
cout << '\n';
}
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
// cin >> T;
while (T--) {
ylh_();
}
}

浙公网安备 33010602011771号