結果
| 問題 | No.317 辺の追加 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-02-03 18:07:13 |
| 言語 | C++14 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 59 ms / 2,000 ms |
| コード長 | 880 bytes |
| 記録 | |
| コンパイル時間 | 1,718 ms |
| コンパイル使用メモリ | 185,516 KB |
| 実行使用メモリ | 7,976 KB |
| 最終ジャッジ日時 | 2026-02-03 18:07:20 |
| 合計ジャッジ時間 | 5,845 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 38 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
int a[200005],b[200005],c[200005];
int w[20005],s[10005],tmp;
int f[100005];
int n,m;
int find(int x){
if(a[x]==x)return x;
return a[x]=find(a[x]);
}
int get(int l,int r){
l=find(l),r=find(r);
if(l==r)return 0;
if(l>r)swap(l,r);
a[r]=l;
return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)a[i]=i;
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
get(l,r);
}
for(int i=1;i<=n;i++)c[find(a[i])]++;
for(int i=1;i<=n;i++)b[c[i]]++;
for(int i=1;i<=m+1;i++){
int q=1;
while(b[i]>=q){
b[i]-=q;
w[++tmp]=q*i,s[tmp]=q;
q=q<<1;
}
if(b[i])w[++tmp]=b[i]*i,s[tmp]=b[i];
b[i]=0;
}
for(int i=1;i<=n;i++)f[i]=1e8;
for(int j=1;j<=tmp;j++)
for(int i=n;i>=w[j];i--)
f[i]=min(f[i-w[j]]+s[j],f[i]);
for(int i=1;i<=n;i++)
if(f[i]==1e8)printf("-1\n");
else printf("%d\n",f[i]-1);
return 0;
}
vjudge1