結果
問題 |
No.1194 Replace
|
ユーザー |
![]() |
提出日時 | 2020-08-24 15:20:54 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,216 ms / 2,000 ms |
コード長 | 4,528 bytes |
コンパイル時間 | 13,563 ms |
コンパイル使用メモリ | 287,672 KB |
最終ジャッジ日時 | 2025-01-13 13:24:36 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#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; }