結果

問題 No.317 辺の追加
ユーザー snuke
提出日時 2015-12-10 00:52:27
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
AC  
実行時間 49 ms / 2,000 ms
コード長 2,287 bytes
コンパイル時間 734 ms
コンパイル使用メモリ 84,504 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-15 07:01:11
合計ジャッジ時間 4,032 ms
ジャッジサーバーID
(参考情報)
judge6 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 38
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:68:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   68 |   scanf("%d%d",&n,&m);
      |   ~~~~~^~~~~~~~~~~~~~
main.cpp:72:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   72 |     scanf("%d%d",&a,&b);
      |     ~~~~~^~~~~~~~~~~~~~

ソースコード

diff #
プレゼンテーションモードにする

#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <string.h>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <map>
#include <set>
#include <iostream>
#include <sstream>
#include <numeric>
#include <cctype>
#define fi first
#define se second
#define rep(i,n) for(int i = 0; i < n; ++i)
#define rrep(i,n) for(int i = 1; i <= n; ++i)
#define drep(i,n) for(int i = n-1; i >= 0; --i)
#define gep(i,g,j) for(int i = g.head[j]; i != -1; i = g.e[i].next)
#define each(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define rng(a) a.begin(),a.end()
#define maxs(x,y) x = max(x,y)
#define mins(x,y) x = min(x,y)
#define pb push_back
#define sz(x) (int)(x).size()
#define pcnt __builtin_popcount
#define snuke srand((unsigned)clock()+(unsigned)time(NULL));
#define df(x) int x = in()
using namespace std;
typedef long long int ll;
typedef pair<int,int> P;
typedef vector<int> vi;
typedef vector<vi> vvi;
inline int in() { int x; scanf("%d",&x); return x;}
inline void priv(vi a) { rep(i,sz(a)) printf("%d%c",a[i],i==sz(a)-1?'\n':' ');}
const int MX = 200005, INF = 1000010000;
const ll LINF = 1000000000000000000ll;
const double eps = 1e-10;
int n, m;
// Union find
struct uf{
vector<int> d;
uf(){}
uf(int mx):d(mx,-1){}
int root(int x){
if(d[x] < 0) return x;
return d[x] = root(d[x]);
}
void unite(int x, int y){
x = root(x); y = root(y);
if(x == y) return;
if(d[x] > d[y]) swap(x,y);
d[x] += d[y]; d[y] = x;
}
};
//
int ans[MX];
int cnt[MX];
int main() {
scanf("%d%d",&n,&m);
uf t(n);
rep(i,m) {
int a, b;
scanf("%d%d",&a,&b);
--a; --b;
t.unite(a,b);
}
rep(i,n) if (t.root(i) == i) {
cnt[-t.d[i]]++;
}
rep(i,n+1) ans[i] = INF;
ans[0] = -1;
int sum = 1;
rrep(i,n) {
if (cnt[i] == 0) continue;
int nc = cnt[i];
vi c;
rep(j,20) {
if (nc >= 1<<j) {
c.pb(1<<j);
nc -= 1<<j;
}
}
if (nc) c.pb(nc);
for (int x : c) {
int xs = x*i;
for (int j = sum; j >= 0; --j) {
mins(ans[j+xs], ans[j]+x);
}
sum += xs;
}
}
rrep(i,n) {
if (ans[i] == INF) ans[i] = -1;
printf("%d\n", ans[i]);
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0