返回顶部

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;
}
posted @ 2022-04-26 21:14  __October  阅读(80)  评论(0)    收藏  举报