結果
問題 | No.317 辺の追加 |
ユーザー |
![]() |
提出日時 | 2025-01-19 11:45:06 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 700 ms / 2,000 ms |
コード長 | 960 bytes |
コンパイル時間 | 3,111 ms |
コンパイル使用メモリ | 167,776 KB |
実行使用メモリ | 141,184 KB |
最終ジャッジ日時 | 2025-01-19 11:46:33 |
合計ジャッジ時間 | 16,633 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 |
ソースコード
#include<bits/stdc++.h>using namespace std;const int N=350,M=1e5+5;int n,m,v[N],w[N],s[N],f[N][M],q[M],hd,tl;int n_,m_,fa[M],siz[M];map<int,int> mp;int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}void merge(int x,int y){x=find(x);y=find(y);if(x==y) return;fa[x]=y;siz[y]+=siz[x];}int main(){cin>>n_>>m_;for(int i=1;i<=n_;i++) fa[i]=i,siz[i]=1;for(int i=1,u,v;i<=m_;i++) cin>>u>>v,merge(u,v);for(int i=1;i<=n_;i++)if(find(i)==i) mp[siz[i]]++;for(auto p:mp) n++,v[n]=p.first,w[n]=-1,s[n]=p.second;m=n_;memset(f,-0x3f,sizeof(f));f[0][0]=0;for(int i=1;i<=n;i++)for(int j=0;j<v[i];j++){hd=0,tl=-1;for(int k=j;k<=m;k+=v[i]){for(;hd<=tl&&k-q[hd]>s[i]*v[i];hd++);for(;hd<=tl&&f[i-1][q[tl]]+(k-q[tl])/v[i]*w[i]<=f[i-1][k];tl--);q[++tl]=k;f[i][k]=f[i-1][q[hd]]+(k-q[hd])/v[i]*w[i];}}for(int i=1;i<=m;i++)if(f[n][i]<-n_) cout<<"-1\n";else cout<<-f[n][i]-1<<endl;return 0;}