2022 GPLT
L2-3 龙龙送外卖
ans = 当前路径长 * 2 - 到根节点的最长边
Sample Code (C++)
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n, m, rt;
cin >> n >> m;
vector<vector<int>> G(n + 1);
vector<int> p(n + 1);
for(int i = 1, x; i <= n; ++ i) {
cin >> x;
if(x == -1) rt = i;
else {
G[x].push_back(i);
p[i] = x;
}
}
vector<int> d(n + 1);
auto dfs = [&](auto self, int u) -> void {
for(int &v : G[u]) {
d[v] = d[u] + 1;
self(self, v);
}
};
d[rt] = 0;
dfs(dfs, rt);
vector<bool> st(n + 1);
st[rt] = 1;
int ans = 0, mx = 0;
while(m -- ) {
int x;
cin >> x;
mx = max(mx, d[x]);
while(st[x] == 0) {
st[x] = 1;
x = p[x];
ans ++;
}
cout << ans * 2 - mx << "\n";
}
return 0;
}
L2-4 大众情人
Floyd
Sample Code (C++)
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n;
cin >> n;
vector<vector<LL>> d(n + 1, vector<LL>(n + 1, 1e16));
for(int i = 1; i <= n; ++ i) d[i][i] = 0;
char c;
vector<int> f(n + 1);
for(int i = 1; i <= n; ++ i) {
cin >> c;
int k;
cin >> k;
if(c == 'F') f[i] = 0;
else f[i] = 1;
for(int j = 1; j <= k; ++ j) {
int a, b;
cin >> a >> c >> b;
d[i][a] = b;
}
}
for(int k = 1; k <= n; ++ k)
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
vector<LL> t(n + 1);
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j)
if(f[j] != f[i])
t[i] = max(t[i], d[j][i]);
LL F = LLONG_MAX, M = LLONG_MAX;
vector<int> v1, v2;
for(int i = 1; i <= n; ++ i)
if(f[i] == 0) F = min(F, t[i]);
for(int i = 1; i <= n; ++ i)
if(f[i] == 0 and F == t[i]) v1.push_back(i);
for(int i = 0; i < v1.size(); ++ i) cout << v1[i] << " \n"[i == v1.size() - 1];
for(int i = 1; i <= n; ++ i)
if(f[i] == 1) M = min(M, t[i]);
for(int i = 1; i <= n; ++ i)
if(f[i] == 1 and M == t[i]) v2.push_back(i);
for(int i = 0; i < v2.size(); ++ i) cout << v2[i] << " \n"[i == v2.size() - 1];
return 0;
}
L3-1 千手观音
拓扑排序
Sample Code (C++)
#include <bits/stdc++.h>
using namespace std;
unordered_map<string, int> mp;
string S[10010];
vector<vector<string>> vs;
vector<string> ts;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n;
cin >> n;
string s;
int idx = 0;
for(int i = 0; i < n; ++ i) {
cin >> s;
s += ".";
string t = "";
ts.clear();
for(int j = 0; j < (int)s.size(); ++ j) {
if(s[j] == '.') {
ts.push_back(t);
if(!mp.count(t)) {
mp[t] = ++ idx;
S[idx] = t;
}
t = "";
}
else t += s[j];
}
vs.push_back(ts);
}
vector<vector<int>> G(idx + 1);
vector<int> d(idx + 1);
for(int i = 1; i < n; ++ i) {
if(vs[i].size() == vs[i - 1].size()) {
for(int j = 0; j < (int)vs[i].size(); ++ j) {
if(vs[i][j] != vs[i - 1][j]) {
int x = mp[vs[i - 1][j]], y = mp[vs[i][j]];
G[x].push_back(y);
d[y] ++;
break;
}
}
}
}
priority_queue<string, vector<string>, greater<string>> q;
int ok = 1;
for(int i = 1; i <= idx; ++ i)
if(d[i] == 0)
q.push(S[i]);
while(!q.empty()) {
string u = q.top();
if(ok) {
cout << u;
ok = 0;
}
else cout << "." << u;
q.pop();
for(int v : G[mp[u]]) {
d[v] --;
if(d[v] == 0) {
q.push(S[v]);
}
}
}
return 0;
}
L3-2 关于深度优先搜索和逆序对的题应该不会很难吧这件事
分 有祖先关系的节点对 和 无祖先关系的节点对 讨论即可
Sample Code (C++)
#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, N = 300010, inv2 = 500000004;
using LL = long long;
int fac[N];
template <typename T>
struct Fenwick {
const int n;
vector<T> a;
Fenwick(int n) : n(n), a(n) {}
void add(int x, T v) {
for (int i = x + 1; i <= n; i += i & -i) {
a[i - 1] += v;
}
}
T sum(int x) {
T ans = 0;
for (int i = x; i > 0; i -= i & -i) {
ans += a[i - 1];
}
return ans;
}
T rangeSum(int l, int r) {
return sum(r) - sum(l);
}
};
int main() {
fac[0] = 1;
for(int i = 1; i < N; ++ i) fac[i] = 1LL * fac[i - 1] * i % P;
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n, r;
cin >> n >> r;
vector<vector<int>> G(n + 1);
for(int i = 1, x, y; i < n; ++ i) {
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
vector<int> sz(n + 1);
Fenwick<int> fw(n + 1);
int k = 1, A = 0, B = 0;
function<void(int, int)> dfs = [&](int u, int p) {
sz[u] = 1;
int cnt = 0;
A = (A + fw.rangeSum(u + 1, n + 1)) % P;
fw.add(u, 1);
for(int &v : G[u])
if(v != p) {
cnt ++;
dfs(v, u);
sz[u] += sz[v];
}
fw.add(u, -1);
for(int &v : G[u])
if(v != p)
B = (B + 1LL * sz[v] * (sz[u] - sz[v] - 1) % P) % P;
k = 1LL * k * fac[cnt] % P;
};
dfs(r, -1);
cout << (1LL * k * inv2 % P * B % P * inv2 % P + 1LL * k * A % P) % P << "\n";
return 0;
}

浙公网安备 33010602011771号