专栏文章

Code

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipojmec
此快照首次捕获于
2025/12/03 15:22
3 个月前
此快照最后确认于
2025/12/03 15:22
3 个月前
查看原文
ABC401FABC 401F
CPP
#include<iostream>
#include<cmath>
#include<cstdio>
#include<random>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<utility>
#include<unordered_map>
#include<unordered_set>
#include<bitset> 
#define int long long
using namespace std;
constexpr int maxn = 1e6 + 10;
constexpr int maxm = 500 + 10;
constexpr int mod = 998244353;
constexpr int mod1 = 1e9 + 7;
constexpr int inf = 1e18 + 10;
constexpr int dx[] = { 1,-1,0,0 };
constexpr int dy[] = { 0,0,1,-1 };
int n, dis[maxn], dis1[maxn], dis2[maxn], n1, n2, maxd, num[maxn], sum[maxn];
vector<int> edge[maxn];
void dfs(int u, int fa) {
    dis[u] = dis[fa] + 1;
    for (auto v : edge[u]) {
        if (v == fa) continue;
        dfs(v, u);
    }
}
void doit1() {
    cin >> n;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    dis[0] = -1;
    dfs(1, 0);
    int p = 0;
    for (int i = 1; i <= n; i++)
        if (dis[i] > dis[p])
            p = i;
    int x = p;
    dfs(x, 0);
    for (int i = 1; i <= n; i++) dis1[i] = dis[i];
    p = 0;
    for (int i = 1; i <= n; i++)
        if (dis[i] > dis[p])
            p = i;
    maxd = max(maxd, dis[p]);
    dfs(p, 0);
    for (int i = 1; i <= n; i++) dis1[i] = max(dis1[i], dis[i]);
}
void doit2() {
    cin >> n;
    for (int i = 1; i <= n; i++) edge[i].clear();
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    dis[0] = -1;
    dfs(1, 0);
    int p = 0;
    for (int i = 1; i <= n; i++)
        if (dis[i] > dis[p])
            p = i;
    int x = p;
    dfs(x, 0);
    for (int i = 1; i <= n; i++) dis2[i] = dis[i];
    p = 0;
    for (int i = 1; i <= n; i++)
        if (dis[i] > dis[p])
            p = i;
    maxd = max(maxd, dis[p]);
    dfs(p, 0);
    for (int i = 1; i <= n; i++) dis2[i] = max(dis2[i], dis[i]);
}
signed main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    doit1(); n1 = n;
    doit2(); n2 = n;
    int ans = 0;
    for (int i = 1; i <= n2; i++)
        num[dis2[i]]++, sum[dis2[i]] += dis2[i];
    for (int i = n2; i >= 0; i--)
        num[i] += num[i + 1], sum[i] += sum[i + 1];
    for (int i = 1; i <= n1; i++) {
        int now = max(0ll, maxd - dis1[i] - 1);
        int cur = num[now];
        ans += sum[now] + cur + cur * dis1[i];
        ans += (n2 - cur) * maxd;
    }
    cout << ans << "\n";
    return 0;
}
P2986P2986
CPP
#include<iostream>
#include<cmath>
#include<cstdio>
#include<random>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<utility>
#include<unordered_map>
#include<unordered_set>
#include<bitset> 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
constexpr int maxn = 2e5 + 10;
constexpr int maxm = 100 + 10;
constexpr int intinf = 1e9 + 10;
constexpr int mod = 998244353;
constexpr ll inf = 1e15 + 10;
constexpr int dx[] = { 1,-1,0,0 };
constexpr int dy[] = { 0,0,1,-1 };
constexpr ld eps = 1e-12;
using namespace std;

ll n, num[maxn], cnt, siz[maxn], g[maxn], dis[maxn], sum, p;
vector<pair<ll, ll>> edge[maxn];

void add(int u, int v, ll w) {
	edge[u].push_back({ v,w });
}

void find(int u, int fa) {
	siz[u] = num[u];
	bool flag = true;
	for (auto [v, w] : edge[u]) {
		if (v == fa) continue;
		find(v, u);
		if (siz[v] > p / 2) flag = false;
		siz[u] += siz[v];
	}
	if (flag && p - siz[u] <= p / 2)
		g[++sum] = u;
}

void dfs(int u, int fa) {
	for (auto [v, w] : edge[u]) {
		if (v == fa) continue;
		dis[v] = dis[u] + w;
		dfs(v, u);
	}
}

void init() {
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> num[i], p += num[i];
	for (int i = 1; i < n; i++) {
		ll u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, w);
	}
	find(1, 0);
	ll ans = inf;
	for (int i = 1; i <= sum; i++) {
		for (int i = 1; i <= n; i++) dis[i] = 0;
		dfs(g[i], 0);
		ll res = 0;
		for (int i = 1; i <= n; i++)
			res += num[i] * dis[i];
		ans = min(ans, res);
	}
	cout << ans << "\n";
}

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);
	init();
	return 0;
}
CF1406CCF1406C
CPP
#include<iostream>
#include<cmath>
#include<cstdio>
#include<random>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<utility>
#include<unordered_map>
#include<unordered_set>
#include<bitset> 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
constexpr int maxn = 2e5 + 10;
constexpr int maxm = 100 + 10;
constexpr int intinf = 1e9 + 10;
constexpr int mod = 998244353;
constexpr ll inf = 1e15 + 10;
constexpr int dx[] = { 1,-1,0,0 };
constexpr int dy[] = { 0,0,1,-1 };
constexpr ld eps = 1e-12;
using namespace std;

ll n, num[maxn], cnt, g[maxn], dis[maxn], sum, siz[maxn], ans;
vector<int> edge[maxn];

void add(int u, int v) {
	edge[u].push_back(v);
}

void find(int u, int fa) {
	siz[u] = 1;
	bool flag = true;
	for (auto v : edge[u]) {
		if (v == fa) continue;
		find(v, u);
		if (siz[v] > n / 2) flag = false;
		siz[u] += siz[v];
	}
	if (flag && n - siz[u] <= n / 2)
		g[++sum] = u;
}

void init() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		edge[i].clear();
	for (int i = 1; i < n; i++) {
		ll u, v;
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
}

void dfs(int u, int fa) {
	bool flag = false;
	for (auto v : edge[u]) {
		if (v == fa) continue;
		dfs(v, u); flag = true;
	}
	if (flag == false) {
		ans = u;
	}
}

void solve() {
	sum = 0;
	find(1, 0);
	if (sum == 1) {
		for (auto v : edge[g[1]]) {
			cout << g[1] << " " << v << "\n";
			cout << g[1] << " " << v << "\n";
			return;
		}
	}
	dfs(g[1], g[2]);
	for (auto v : edge[ans]) {
		cout << ans << " " << v << "\n";
		cout << ans << " " << g[2] << "\n";
		return;
	}
}

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int T; cin >> T;
	while (T--) {
		init();
		solve();
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...