結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
cureskol
|
| 提出日時 | 2022-05-28 18:27:59 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,979 bytes |
| コンパイル時間 | 3,112 ms |
| コンパイル使用メモリ | 201,424 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-20 23:25:41 |
| 合計ジャッジ時間 | 3,780 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 WA * 12 |
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:128:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
128 | for(auto&[key,val]:mp)val=cnt++;
| ^
main.cpp:130:20: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
130 | for(const auto&[key,val]:mp)g.add_edge(mp[l[key]],val);
| ^
main.cpp:133:20: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
133 | for(const auto&[key,val]:mp)if(!g.blg[val])
| ^
ソースコード
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#ifdef __LOCAL
#include <debug>
#else
#define debug(...) void(0)
#endif
#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
template<typename T>
istream& operator>>(istream&is,vector<T>&v){
for(T&p:v)is>>p;
return is;
}
template<typename T>
ostream& operator<<(ostream&os,const vector<T>&v){
if(&os==&cerr)os<<"[";
for(int i=0;i<v.size();i++){
os<<v[i];
if(i+1<v.size())os<<(&os==&cerr?",":" ");
}
if(&os==&cerr)os<<"]";
return os;
}
struct SCC{
vector<vector<int>> G,R,T,C;
//G:元のグラフ R:Gの逆辺グラフ T:DAG C[i]:SCC後の頂点iに属しているGの頂点集合
vector<int> vs,used,blg;
//blg[v]:元のグラフの頂点vがSCC後に属している頂点の名前
SCC(){}
SCC(int n):G(n),R(n),used(n),blg(n){}
void add_edge(int u,int v){
G[u].emplace_back(v);
R[v].emplace_back(u);
}
inline void dfs(int v){
used[v]=1;
for(int u:G[v])if(!used[u])dfs(u);
vs.emplace_back(v);
}
inline void rdfs(int v,int k){
used[v]=1;
blg[v]=k;
C[k].emplace_back(v);
for(int u:R[v])if(!used[u])rdfs(u,k);
}
int build(){//DAGのサイズを返す
int n=G.size();
for(int v=0;v<n;v++)if(!used[v])dfs(v);
fill(used.begin(),used.end(),0);
int k=0;
for(int i=n-1;i>=0;i--)
if(!used[vs[i]]){
T.emplace_back();
C.emplace_back();
rdfs(vs[i],k++);
}
for(int v=0;v<n;v++)
for(int u:G[v])
if(blg[v]!=blg[u])
T[blg[v]].push_back(blg[u]);
for(int i=0;i<k;i++){
sort(T[i].begin(),T[i].end());
T[i].erase(unique(T[i].begin(),T[i].end()),T[i].end());
}
return k;
}
int operator[](int k) const{return blg[k];}
};
//BEGIN CUT HERE
struct UnionFind{
int num;
vector<int> r,p;
UnionFind(){}
UnionFind(int n):num(n),r(n,1),p(n,0){iota(p.begin(),p.end(),0);}
int find(int x){
return (x==p[x]?x:p[x]=find(p[x]));
}
bool same(int x,int y){
return find(x)==find(y);
}
bool unite(int x,int y){
x=find(x);y=find(y);
if(x==y)return false;
if(r[x]<r[y]) swap(x,y);
r[x]+=r[y];
p[y]=x;
num--;
return true;
}
int size(int x){
return r[find(x)];
}
int count() const{
return num;
}
};
//END CUT HERE
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;cin>>n;
vector<int> l(n),s(n);
REP(i,n)cin>>s[i]>>l[i];
UnionFind uf(n);
REP(i,n){
l[i]--;
uf.unite(l[i],i);
}
int ans=0;
REP(i,n)if(uf.find(i)==i){
map<int,int> mp;
REP(j,n)if(uf.find(j)==i)mp[j];
int cnt=0;
for(auto&[key,val]:mp)val=cnt++;
SCC g(cnt);
for(const auto&[key,val]:mp)g.add_edge(mp[l[key]],val);
g.build();
int mn=1e9;
for(const auto&[key,val]:mp)if(!g.blg[val])
mn=min(mn,s[key]);
ans+=mn;
}
REP(i,n)ans+=s[i];
cout<<ans/2;
if(ans&1)cout<<".5";
cout<<endl;
}
cureskol