結果
| 問題 | No.1950 片道きゃっちぼーる |
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2023-06-29 16:23:38 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2,617 ms / 3,000 ms |
| コード長 | 2,359 bytes |
| コンパイル時間 | 2,599 ms |
| コンパイル使用メモリ | 219,632 KB |
| 最終ジャッジ日時 | 2025-02-15 03:06:35 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<bool> vst;
vector<int> I, loop;
void dfs1(vector<vector<int>> &E, int from){
vst[from] = 1;
for(auto to : E[from]){
if (vst[to]) continue;
dfs1(E, to);
}
I.push_back(from);
}
void dfs2(vector<vector<int>> &E, int from){
vst[from] = 1;
loop.push_back(from);
for(auto to : E[from]){
if (vst[to]) continue;
dfs2(E, to);
}
}
vector<vector<int>> scc(vector<vector<int>> &E){
int N = E.size();
vector<vector<int>> res, e(N);
vst.resize(N);
for (int i=0; i<N; i++){
for (auto x : E[i]) e[x].push_back(i);
}
for (int i=0; i<N; i++) if (!vst[i]) dfs1(E, i);
reverse(I.begin(), I.end());
for (int i=0; i<N; i++) vst[i] = 0;
for (auto x : I){
if (!vst[x]){
loop.clear();
dfs2(e, x);
vector<int> sub;
reverse(loop.begin(), loop.end());
for (auto y : loop) sub.push_back(y);
res.push_back(sub);
}
}
return res;
}
template <typename T>
map<T, T> compress(vector<T> &A){
map<T, T> comp;
int N = A.size(), i=0;
for (int i=0; i<N; i++) comp[A[i]];
for (auto &e : comp){
e.second = i;
i++;
}
return comp;
}
int main(){
ll N, M, K;
cin >> N;
vector<ll> X(N), A(N), v;
for (int i=0; i<N; i++) cin >> X[i];
for (int i=0; i<N; i++) cin >> A[i];
for (int i=0; i<N; i++){
v.push_back(X[i]);
v.push_back(A[i]+X[i]);
v.push_back(X[i]-A[i]);
}
map<ll, ll> mp = compress(v), rev;
for (auto [x, y] : mp) rev[y] = x;
M = mp.size();
vector<vector<int>> E(M), S;
for (int i=0; i<N; i++){
E[mp[X[i]+A[i]]].push_back(mp[X[i]]);
E[mp[X[i]-A[i]]].push_back(mp[X[i]]);
}
S = scc(E);
K = S.size();
vector<ll> dp(K, -2e9), root(M);
for (int i=0; i<S.size(); i++){
for (auto x : S[i]){
root[x] = i;
dp[i] = max(rev[x], dp[i]);
}
}
for (int i=0; i<S.size(); i++){
for (auto x : S[i]){
for (auto y : E[x]){
dp[root[y]] = max(dp[root[y]], dp[i]);
}
}
}
for (int i=0; i<N; i++) cout << dp[root[mp[X[i]]]]-X[i] << endl;
return 0;
}
srjywrdnprkt