結果
問題 | No.1194 Replace |
ユーザー | theory_and_me |
提出日時 | 2020-08-24 15:20:54 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,165 ms / 2,000 ms |
コード長 | 4,528 bytes |
コンパイル時間 | 4,016 ms |
コンパイル使用メモリ | 233,736 KB |
実行使用メモリ | 129,896 KB |
最終ジャッジ日時 | 2024-11-06 10:20:57 |
合計ジャッジ時間 | 21,405 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 699 ms
83,100 KB |
testcase_01 | AC | 761 ms
87,840 KB |
testcase_02 | AC | 574 ms
72,504 KB |
testcase_03 | AC | 475 ms
62,476 KB |
testcase_04 | AC | 771 ms
87,988 KB |
testcase_05 | AC | 711 ms
82,224 KB |
testcase_06 | AC | 636 ms
77,196 KB |
testcase_07 | AC | 1,109 ms
129,736 KB |
testcase_08 | AC | 1,107 ms
129,692 KB |
testcase_09 | AC | 1,165 ms
129,760 KB |
testcase_10 | AC | 1,146 ms
129,784 KB |
testcase_11 | AC | 1,121 ms
129,896 KB |
testcase_12 | AC | 1,148 ms
129,804 KB |
testcase_13 | AC | 542 ms
47,936 KB |
testcase_14 | AC | 449 ms
39,056 KB |
testcase_15 | AC | 422 ms
45,624 KB |
testcase_16 | AC | 526 ms
48,472 KB |
testcase_17 | AC | 359 ms
41,280 KB |
testcase_18 | AC | 354 ms
35,244 KB |
testcase_19 | AC | 553 ms
51,092 KB |
testcase_20 | AC | 2 ms
6,816 KB |
testcase_21 | AC | 2 ms
6,816 KB |
testcase_22 | AC | 2 ms
6,816 KB |
testcase_23 | AC | 135 ms
22,624 KB |
testcase_24 | AC | 42 ms
11,776 KB |
testcase_25 | AC | 13 ms
6,816 KB |
testcase_26 | AC | 149 ms
17,556 KB |
testcase_27 | AC | 18 ms
6,820 KB |
testcase_28 | AC | 60 ms
10,496 KB |
testcase_29 | AC | 8 ms
6,816 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define REP(i,n) for(ll i=0;i<(ll)n;i++) #define dump(x) cerr << #x << " = " << (x) << endl; #define spa << " " << #define fi first #define se second #define ALL(a) (a).begin(),(a).end() #define ALLR(a) (a).rbegin(),(a).rend() using ld = long double; using ll = long long; using ull = unsigned long long; using pii = pair<int, int>; using pll = pair<long, long>; using pdd = pair<ld, ld>; template<typename T> struct V : vector<T> { using vector<T>::vector; }; V() -> V<ll>; V(size_t) -> V<ll>; template<typename T> V(size_t, T) -> V<T>; template<typename T> vector<T> make_vec(size_t n, T a) { return vector<T>(n, a); } template<typename... Ts> auto make_vec(size_t n, Ts... ts) { return vector<decltype(make_vec(ts...))>(n, make_vec(ts...)); } template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){os << "(" << v.first << ", " << v.second << ")"; return os;} template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { for (auto &e : v) os << e << ' '; return os; } template<class T> ostream& operator<<(ostream& os, const vector<vector<T>> &v){ for(auto &e : v){os << e << "\n";} return os;} struct fast_ios { fast_ios(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_; template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; } template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; } void fail() { cout << -1 << '\n'; exit(0); } inline int popcount(const int x) { return __builtin_popcount(x); } inline int popcount(const ll x) { return __builtin_popcountll(x); } template<typename T> void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++) {cerr<<v[i][0];for(ll j=1;j<w;j++)cerr spa v[i][j];cerr<<endl;}}; template<typename T> void debug(vector<T>&v,ll n){if(n!=0)cerr<<v[0]; for(ll i=1;i<n;i++)cerr spa v[i]; cerr<<endl;}; const ll INF = (1ll<<62); // const ld EPS = 1e-10; // const ld PI = acos(-1.0); const ll mod = (int)1e9 + 7; //const ll mod = 998244353; using Graph = V<V<ll>>; template< typename G > struct StronglyConnectedComponents { const G &g; Graph gg, rg; vector< int > comp, order, used; StronglyConnectedComponents(G &g) : g(g), gg(g.size()), rg(g.size()), comp(g.size(), -1), used(g.size()) { for(int i = 0; i < (int)g.size(); i++) { for(auto e : g[i]) { gg[i].emplace_back((int) e); rg[(int) e].emplace_back(i); } } } int operator[](int k) { return comp[k]; } void dfs(int idx) { if(used[idx]) return; used[idx] = true; for(int to : gg[idx]) dfs(to); order.push_back(idx); } void rdfs(int idx, int cnt) { if(comp[idx] != -1) return; comp[idx] = cnt; for(int to : rg[idx]) rdfs(to, cnt); } void build(Graph &t) { for(int i = 0; i < (int)gg.size(); i++) dfs(i); reverse(begin(order), end(order)); int ptr = 0; for(int i : order) if(comp[i] == -1) rdfs(i, ptr), ptr++; t.resize(ptr); for(int i = 0; i < (int)g.size(); i++) { for(auto &to : g[i]) { int x = comp[i], y = comp[to]; if(x == y) continue; t[x].push_back(y); } } } }; int main(){ ll N, M; cin >> N >> M; ll res = 0; res += N * (N+1) / 2; V<ll> B(M), C(M); REP(i, M){ cin >> B[i] >> C[i]; } set<ll> st; REP(i, M){ st.insert(B[i]); st.insert(C[i]); } map<ll, ll> mp; ll cnt = 0; V<ll> score; for(auto x: st){ mp[x] = cnt; score.push_back(x); cnt++; res -= x; } ll K = cnt; Graph G(K), T; REP(i, M){ G[mp[B[i]]].push_back(mp[C[i]]); } for(auto &v: G){ sort(ALL(v)); v.erase(unique(ALL(v)), v.end()); } StronglyConnectedComponents<Graph> scc(G); scc.build(T); ll S = T.size(); for(auto &v: T){ sort(ALL(v)); v.erase(unique(ALL(v)), v.end()); } V<ll> ma(S, 0), sz(S, 0); REP(i, K){ chmax(ma[scc[i]], score[i]); sz[scc[i]]++; } V<ll> dp(S, -1); // dump(S) auto rec = [&](auto self, ll now){ if(dp[now]>=0) return dp[now]; ll val = ma[now]; for(auto next: T[now]){ ll tmp = self(self, next); chmax(val, tmp); } dp[now] = val; res += val * sz[now]; return val; }; REP(i, S) rec(rec, i); cout << res << endl; return 0; }