結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
iwata
|
| 提出日時 | 2019-12-03 22:59:39 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,402 bytes |
| コンパイル時間 | 1,547 ms |
| コンパイル使用メモリ | 177,268 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-27 22:36:20 |
| 合計ジャッジ時間 | 2,320 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 6 WA * 18 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define debug(n) cerr << #n << ':' << n << endl;
#define dline cerr << __LINE__ << endl;
using ll = long long;
template<class T, class U> using P = pair<T,U>;
template<class T> using Heap = priority_queue<T>;
template<class T> using heaP = priority_queue<T,vector<T>,greater<T>>;
template<class T,class U> using umap = unordered_map<T,U>;
template<class T> using uset = unordered_set<T>;
template<class T>
bool ChangeMax(T&a,const T&b){
if(a >= b) return false;
a = b; return true;
}
template<class T>
bool ChangeMin(T&a,const T&b){
if(a <= b) return false;
a = b; return true;
}
template<class T, size_t N, class U>
void Fill(T (&a)[N], const U&v){
fill((U*)a,(U*)(a+N),v);
}
template<class T>
istream& operator >> (istream&is, vector<T>&v){
for(auto&e:v)is >> e;
return is;
}
struct Scc{
int vsize,esize;
vector<vector<int>> ne,re;
vector<int> od,cs;
vector<bool> used;
Scc(vector<vector<int>>g,int vs,int es):
vsize(vs),esize(es),ne(g),re(vs),cs(vs,-1),used(vs,false)
{
for(int i = 0; i < vsize; ++i){
for(auto&e:ne[i]){
re[e].push_back(i);
}
}
for(int i = 0; i < vsize; ++i)dfs(i);
reverse(od.begin(),od.end());
int y = 0;
for(int e:od){
if(cs[e] != -1)continue;
rdfs(e,y);
y++;
}
}
int operator[](int idx){
return cs[idx];
}
void dfs(int x){
if(used[x]) return;
used[x] = 1;
for(auto&e:ne[x])dfs(e);
od.push_back(x);
}
void rdfs(int x,int y){
if(cs[x] != -1)return;
cs[x] = y;
for(auto&e:re[x])rdfs(e,y);
}
};
int main(){
int n; cin >> n;
vector<vector<int>> g(n);
vector<double> level(n);
for(int i = 0; i < n; ++i){
int a,b; cin >> a >> b; b--;
g[i].push_back(b);
level[i] = a;
}
Scc scc(g,n,n);
set<int> st;
double sum = 0;
vector<int> order(n);
for(int i = 0; i < n; ++i)order[i] = i;
sort(order.begin(), order.end(), [&](int a, int b){
if(scc.cs[a] == scc.cs[b]) return level[a] < level[b];
return scc.cs[a] < scc.cs[b];
});
for(int j = 0; j < n; ++j){
int i = order[j];
int cs = scc.cs[i];
if(st.count(cs) == 0){sum += level[i];cerr << i+1 << ':' << 0 << endl;}
else{ sum += level[i]/2;cerr << i+1 << ':' << 1 << endl;}
st.insert(scc.cs[g[i][0]]);
}
cout << fixed << setprecision(1) << sum << endl;
return 0;
}
iwata