結果
問題 | No.1194 Replace |
ユーザー | yukudo |
提出日時 | 2020-09-02 14:15:31 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 515 ms / 2,000 ms |
コード長 | 2,979 bytes |
コンパイル時間 | 2,159 ms |
コンパイル使用メモリ | 190,900 KB |
実行使用メモリ | 64,924 KB |
最終ジャッジ日時 | 2024-11-21 14:10:04 |
合計ジャッジ時間 | 11,221 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 328 ms
51,732 KB |
testcase_01 | AC | 355 ms
53,360 KB |
testcase_02 | AC | 269 ms
48,340 KB |
testcase_03 | AC | 218 ms
44,536 KB |
testcase_04 | AC | 360 ms
53,492 KB |
testcase_05 | AC | 321 ms
51,404 KB |
testcase_06 | AC | 290 ms
49,936 KB |
testcase_07 | AC | 501 ms
64,868 KB |
testcase_08 | AC | 515 ms
64,920 KB |
testcase_09 | AC | 500 ms
64,912 KB |
testcase_10 | AC | 497 ms
64,924 KB |
testcase_11 | AC | 508 ms
64,908 KB |
testcase_12 | AC | 499 ms
64,872 KB |
testcase_13 | AC | 271 ms
43,752 KB |
testcase_14 | AC | 233 ms
40,464 KB |
testcase_15 | AC | 194 ms
41,140 KB |
testcase_16 | AC | 262 ms
43,648 KB |
testcase_17 | AC | 183 ms
39,572 KB |
testcase_18 | AC | 179 ms
37,984 KB |
testcase_19 | AC | 259 ms
44,196 KB |
testcase_20 | AC | 11 ms
24,516 KB |
testcase_21 | AC | 12 ms
24,556 KB |
testcase_22 | AC | 11 ms
24,364 KB |
testcase_23 | AC | 82 ms
31,980 KB |
testcase_24 | AC | 34 ms
27,280 KB |
testcase_25 | AC | 21 ms
25,176 KB |
testcase_26 | AC | 103 ms
31,220 KB |
testcase_27 | AC | 28 ms
25,808 KB |
testcase_28 | AC | 51 ms
27,508 KB |
testcase_29 | AC | 14 ms
24,888 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define REP(i,n) for(int i=0,_n=(int)(n);i<_n;++i) #define ALL(v) (v).begin(),(v).end() #define CLR(t,v) memset(t,(v),sizeof(t)) template<class T1,class T2>ostream& operator<<(ostream& os,const pair<T1,T2>&a){return os<<"("<<a.first<<","<<a.second<< ")";} template<class T>void pv(T a,T b){for(T i=a;i!=b;++i)cout<<(*i)<<" ";cout<<endl;} template<class T>void chmin(T&a,const T&b){if(a>b)a=b;} template<class T>void chmax(T&a,const T&b){if(a<b)a=b;} ll nextLong() { ll x; scanf("%lld", &x); return x;} const int MAX_N = 412345; vector<int> g[MAX_N]; vector<int> r[MAX_N]; int sccid[MAX_N]; int sccnum; void dfs(int p, vector<int>& order) { if (sccid[p] != 0) return; sccid[p] = 1; for (int i : g[p]) dfs(i, order); order.push_back(p); } void rdfs(int p, int id) { if (sccid[p] != -1) return; sccid[p] = id; for (int i : r[p]) rdfs(i, id); } void scc(int N) { vector<int> order; CLR(sccid, 0); REP(i, N) dfs(i, order); CLR(sccid, -1); sccnum = 0; for (int i = (int)order.size() - 1; i >= 0; i--) if (sccid[order[i]] == -1) { rdfs(order[i], sccnum); sccnum++; } } // 座標圧縮 vector<ll> rev; // 圧縮後の値から元の値への写像 vector<int> normalize(const vector<ll> v) { const int N = v.size(); vector<int> res(N); vector<pair<ll,int> > t(N); rev = vector<ll>(N); REP(i, N) t[i] = { v[i], i }; sort(ALL(t)); int r = 0; REP(i, N) { r += (i > 0 && t[i - 1].first != t[i].first); res[t[i].second] = r; rev[r] = t[i].first; } rev.erase(rev.begin() + r + 1, rev.end()); return res; } int main2() { REP(i, MAX_N) g[i].clear(); REP(i, MAX_N) r[i].clear(); int N = nextLong(); int M = nextLong(); vector<ll> es_row(2 * M); REP(i, M) { int a = nextLong(); int b = nextLong(); es_row[2 * i ] = a; es_row[2 * i + 1] = b; } auto es = normalize(es_row); // pv(ALL(rev)); ll ans = (ll)(N+1)*N/2; for (auto x : set<ll>(ALL(es_row))) { ans -= x; } REP(i, M) { int a = es[i * 2]; int b = es[i * 2 + 1]; g[a].push_back(b); r[b].push_back(a); } int V = rev.size(); scc(V); vector<vector<int>> gg(sccnum); vector<int> scc_size(sccnum); vector<ll> scc_max(sccnum); REP(i, V) { scc_size[sccid[i]]++; for (int j : g[i]) { if (sccid[i] != sccid[j]) gg[sccid[i]].push_back(sccid[j]); } chmax(scc_max[sccid[i]], rev[i]); } REP(s, sccnum) { sort(ALL(gg[s])); gg[s].erase(unique(ALL(gg[s])), gg[s].end()); // cout << s << " : "; pv(ALL(gg[s])); } // cout << "size: "; pv(ALL(scc_size)); // cout << "max: "; pv(ALL(scc_max)); for (int s = sccnum - 1; s >= 0; s--) { for (int nxt : gg[s]) { chmax(scc_max[s], scc_max[nxt]); } ans += scc_max[s] * scc_size[s]; } cout << ans << endl; return 0; } int main() { #ifdef LOCAL for (;!cin.eof();cin>>ws) #endif main2(); return 0; }