結果
| 問題 |
No.1014 competitive fighting
|
| コンテスト | |
| ユーザー |
kibuna
|
| 提出日時 | 2020-03-23 22:57:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,240 bytes |
| コンパイル時間 | 2,552 ms |
| コンパイル使用メモリ | 189,276 KB |
| 実行使用メモリ | 106,964 KB |
| 最終ジャッジ日時 | 2024-12-29 13:03:19 |
| 合計ジャッジ時間 | 20,273 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 WA * 27 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
const lint inf = 1e15;
const lint mod = 1000000007;
struct StronglyConnectedComponents {
vector<vector<int>> const &edges_in;
vector<vector<int>> edges, rev, dag;
vector<int> comp, order, used;
vector<vector<int>> cs; // list of nodes in each component
StronglyConnectedComponents(vector<vector<int>> const &g)
: edges_in(g), edges(g.size()), rev(g.size()), comp(g.size(), -1), used(g.size()), cs(g.size()) {
for (int i = 0; i < (int)edges_in.size(); ++i) {
for (auto &v : edges_in[i]) {
edges[i].push_back(v);
rev[v].push_back(i);
}
}
build();
}
int operator[](int k) { return comp[k]; }
void dfs(int c) {
if (used[c])
return;
used[c] = true;
for (auto &v : edges[c])
dfs(v);
order.push_back(c);
}
void rdfs(int c, int cnt) {
if (comp[c] != -1)
return;
comp[c] = cnt;
cs[cnt].emplace_back(c);
for (auto &v : rev[c])
rdfs(v, cnt);
}
void build() {
for (int i = 0; i < (int)edges.size(); ++i)
dfs(i);
reverse(order.begin(), order.end());
int ptr = 0;
for (auto &i : order) {
if (comp[i] == -1)
rdfs(i, ptr++);
}
dag.resize(ptr);
for (int i = 0; i < (int)edges_in.size(); ++i) {
int x = comp[i];
for (auto &v : edges_in[i]) {
int y = comp[v];
if (x == y)
continue;
dag[x].push_back(y);
}
}
}
};
template <class T>
bool chmax(T &a, const T &b) {
return (a < b) ? (a = b, 1) : 0;
}
template <class T>
bool chmin(T &a, const T &b) {
return (b < a) ? (a = b, 1) : 0;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
lint n;
cin >> n;
map<lint, lint> idx;
vector<lint> a(n), b(n), c(n);
for (int i = 0; i < n; ++i) {
cin >> a[i] >> b[i] >> c[i];
idx[a[i]] = 0;
idx[b[i] - c[i]] = 0;
}
int id = 0;
for (auto &p : idx) {
p.second = id++;
}
int k = idx.size();
vector<vector<int>> edges(n + k);
for (int i = 0; i < k - 1; ++i) {
edges[i].push_back(i + 1);
}
for (int i = k; i < k + n; ++i) {
edges[i].push_back(idx[a[i - k]]);
edges[idx[b[i - k] - c[i - k]]].push_back(i);
}
StronglyConnectedComponents scc(edges);
vector<int> cnt(n + k, 0);
for (int i = k; i < n + k; ++i) {
cnt[scc[i]]++;
}
lint m = scc.dag.size();
vector<lint> dp(m, 0);
for (int i = 0; i < m; ++i) {
if (cnt[i] > 1) {
dp[i] = inf;
continue;
}
for (auto &v : scc.cs[i]) {
if (v >= k)
dp[i] += b[v - k];
}
for (auto &v : scc.dag[i]) {
chmax(dp[v], dp[i]);
}
}
for (int i = k; i < k + n; ++i) {
if (dp[scc[i]] >= inf)
cout << "BAN" << endl;
else
cout << dp[scc[i]] << endl;
}
return 0;
}
kibuna