結果
| 問題 |
No.1194 Replace
|
| ユーザー |
|
| 提出日時 | 2020-09-02 14:15:31 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#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;
}