专栏文章
Code
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipojmec
- 此快照首次捕获于
- 2025/12/03 15:22 3 个月前
- 此快照最后确认于
- 2025/12/03 15:22 3 个月前
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;
}
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;
}
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 条评论,欢迎与作者交流。
正在加载评论...