new file: P2607.cpp
Check cpp / md pair / Check md headers (push) Successful in 4s

This commit is contained in:
hanyixuanten committed 2026-10-27 09:56:13 +00:00
1 parent fc3d90c48a
commit e73f99c52a
2 files changed
+102

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int p[1000005];
vector<int> fri[1000005];
int bc[1000005];
vector<pair<int, int>> ST;
int find(int now) {
if(bc[now] == now) return now;
return bc[now] = find(bc[now]);
}
int dps[1000005][2], dpt[1000005][2];
void dfs(int now, bool s, int from, int st) {
if(s) dps[now][1] = p[now];
else dpt[now][1] = p[now];
if(s && now == st) dps[now][1] = LLONG_MIN;
else if(!s && now == st) dpt[now][1] = LLONG_MIN;
for(int i:fri[now]) {
if(i == from) continue;
dfs(i, s, now, st);
if(s) dps[now][1] += dps[i][0], dps[now][0] += max(dps[i][0], dps[i][1]);
else dpt[now][1] += dpt[i][0], dpt[now][0] += max(dpt[i][0], dpt[i][1]);
}
}
signed main() {
scanf("%lld", &n);
for(int i = 1; i <= n; ++i) {
bc[i] = i;
}
for(int i = 1, v; i <= n; ++i) {
scanf("%lld%lld", &p[i], &v);
if(find(i) == find(v)) {
ST.push_back({i, v});
} else {
fri[i].push_back(v);
fri[v].push_back(i);
bc[find(i)] = find(v);
}
}
int ans = 0;
for(auto [s, t]:ST){
dfs(s, 1, -1, s);
dfs(t, 0, -1, t);
ans += max(max(dps[s][0], dps[s][1]), max(dpt[t][1], dpt[t][0]));
}
printf("%lld\n", ans);
return 0;
}
+53
View File
@@ -0,0 +1,53 @@
# P2607 [ZJOI2008] 骑士
## 题目描述
Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。
最近发生了一件可怕的事情,邪恶的 Y 国发动了一场针对 Z 国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的 Z 国又怎能抵挡的住 Y 国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。
骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。
战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。
为了描述战斗力,我们将骑士按照 $1$ 至 $n$ 编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。
## 输入格式
第一行包含一个整数 $n$,描述骑士团的人数。
接下来 $n$ 行,每行两个整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。
## 输出格式
应输出一行,包含一个整数,表示你所选出的骑士军团的战斗力。
## 输入输出样例 #1
### 输入 #1
```
3
10 2
20 3
30 1
```
### 输出 #1
```
30
```
## 说明/提示
#### 数据规模与约定
对于 $30\%$ 的测试数据,满足 $n \le 10$;
对于 $60\%$ 的测试数据,满足 $n \le 100$;
对于 $80\%$ 的测试数据,满足 $n \le 10 ^4$。
对于 $100\%$ 的测试数据,满足 $1\le n \le 10^6$,每名骑士的战斗力都是不大于 $10^6$ 的正整数。