結果
問題 | No.19 ステージの選択 |
ユーザー | y_mazun |
提出日時 | 2015-04-24 21:01:23 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,676 bytes |
コンパイル時間 | 635 ms |
コンパイル使用メモリ | 76,628 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-02 12:29:00 |
合計ジャッジ時間 | 1,350 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 1 ms
5,376 KB |
testcase_03 | AC | 1 ms
5,376 KB |
testcase_04 | AC | 1 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 1 ms
5,376 KB |
testcase_09 | AC | 1 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 1 ms
5,376 KB |
testcase_12 | AC | 1 ms
5,376 KB |
testcase_13 | AC | 1 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 1 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 2 ms
5,376 KB |
testcase_19 | AC | 2 ms
5,376 KB |
testcase_20 | AC | 1 ms
5,376 KB |
testcase_21 | AC | 2 ms
5,376 KB |
testcase_22 | AC | 2 ms
5,376 KB |
testcase_23 | AC | 1 ms
5,376 KB |
コンパイルメッセージ
main.cpp: In function ‘int getInt()’: main.cpp:6:34: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 6 | inline int getInt(){ int s; scanf("%d", &s); return s; } | ~~~~~^~~~~~~~~~
ソースコード
#include <iostream> #define REP(i,n) for(int i=0; i<(int)(n); i++) #include <queue> #include <cstdio> inline int getInt(){ int s; scanf("%d", &s); return s; } #include <set> using namespace std; class UnionFind{ private: mutable vector<int> id; int getId(int i) const{ if(i == id[i]) return i; return id[i] = getId(id[i]); } public: UnionFind(int size = 0){ init(size); } ~UnionFind(){} void init(int size){ id = vector<int>(size); for(int i = 0; i < size; i++) id[i] = i; } void unite(int i, int j){ int next = min( getId(i), getId(j) ); id[getId(i)] = id[getId(j)] = next; } int operator [](int i) const{ return getId(i); } int count() const{ set<int> s; for(int i = 0; i < (int)id.size(); i++) s.insert(getId(i)); return s.size(); } }; int l[100]; vector<int> s[100]; int f[100]; pair<int, double> dfs(int pos, int d = 0){ if(f[pos]) return make_pair(0, 0.); int cnt = 1; double ret = l[pos]; if(d) ret /= 2; f[pos] = 1; REP(i,s[pos].size()){ pair<int, double> tmp = dfs(s[pos][i], 1); cnt += tmp.first; ret += tmp.second; } f[pos] = 0; return make_pair(cnt, ret); } int main(){ const int n = getInt(); UnionFind uf(n); REP(i,n){ l[i] = getInt(); const int ss = getInt() - 1; s[ss].push_back(i); uf.unite(i, ss); } vector<int> cnts(n); REP(i,n) cnts[uf[i]]++; vector<double> memo(n, 1e10); REP(i,n){ pair<int, double> tmp = dfs(i); if(tmp.first == cnts[uf[i]]) memo[uf[i]] = min(memo[uf[i]], tmp.second); } double ans = 0; REP(i,n) if(uf[i] == i) ans += memo[i]; printf("%.1f\n", ans); return 0; }