結果
問題 | No.19 ステージの選択 |
ユーザー |
|
提出日時 | 2025-06-09 21:23:30 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,721 bytes |
コンパイル時間 | 2,641 ms |
コンパイル使用メモリ | 205,888 KB |
実行使用メモリ | 6,272 KB |
最終ジャッジ日時 | 2025-06-09 21:23:34 |
合計ジャッジ時間 | 4,037 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 24 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; class dsu{ public: dsu()=default; explicit dsu(size_t n):m_parentsOrSize(n,-1){} int leader(int i){ if (m_parentsOrSize[i]<0)return i; return(m_parentsOrSize[i]=leader(m_parentsOrSize[i])); } int merge(int a,int b){ a=leader(a); b=leader(b); if (a!=b){ if(-m_parentsOrSize[a]<-m_parentsOrSize[b])std::swap(a,b); m_parentsOrSize[a]+=m_parentsOrSize[b]; m_parentsOrSize[b]=a; } return leader(a); } bool same(int a,int b){return(leader(a)==leader(b));} int size(int i){return -m_parentsOrSize[leader(i)];} std::vector<std::vector<int>>groups(){ size_t n=m_parentsOrSize.size(); std::vector<std::vector<int>>A(n); for(int i=0;i<n;i++)A[leader(i)].emplace_back(i); std::vector<std::vector<int>>res; for(auto a:A)if(a.size())res.emplace_back(a); return res; } private: std::vector<int>m_parentsOrSize; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N;cin>>N; vector<ll>L(N),S(N); ll ans=0; for(int i=0;i<N;++i){ cin>>L[i]>>S[i]; ans+=L[i]; } dsu uf(N); for(int i=0;i<N;++i){ uf.merge(i,S[i]-1); } auto grps=uf.groups(); vector<bool> vis(N); for(auto&g:grps){ auto u=g[0]; while(!vis[u]){ vis[u]=1; u=S[u]-1; } vector<int> cycle; while(vis[u]){ vis[u]=0; cycle.emplace_back(u); u=S[u]-1; } ll m=1e18; for(auto&x:cycle){ m=min(m,L[x]); vis[m]=0; } ans+=m; } cout<<(ans>>1)<<((ans&1)?".5":".0")<<endl; return 0; }