結果
| 問題 |
No.3049 Contest Coordinator
|
| コンテスト | |
| ユーザー |
ococonomy1
|
| 提出日時 | 2025-03-07 21:26:01 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 162 ms / 2,000 ms |
| コード長 | 4,134 bytes |
| コンパイル時間 | 2,595 ms |
| コンパイル使用メモリ | 210,808 KB |
| 実行使用メモリ | 16,816 KB |
| 最終ジャッジ日時 | 2025-03-07 21:26:12 |
| 合計ジャッジ時間 | 10,654 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 58 |
ソースコード
//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using pli = pair<ll,int>;
using vi = vector<int>;
using vl = vector<long long>;
#define TEST cerr << "TEST" << endl
#define AMARI 998244353
//#define AMARI 1000000007
#define el '\n'
#define El '\n'
#define YESNO(x) ((x) ? "Yes" : "No")
#define YES YESNO(true)
#define NO YESNO(false)
#define VEC_UNIQ(v) {sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());}
#define REV_PRIORITY_QUEUE(tp) priority_queue<tp,vector<tp>,greater<tp>>
#define NO_ANS(x) {cout << (x) << '\n'; return;}
//UnionFind T には何か乗せたいものを乗せられる(連結成分の大きさなど)
template <typename T> class ococo_unionfind {
private:
vector<pair<int,int>> g;
vector<T> vec;
int com_cnt;
T func(T a,T b){
return (a + b);
}
public:
ococo_unionfind(int n = 0){
g.resize(n);
vec.resize(n);
for(int i = 0; i < n; i++)g[i] = pair(i,1);
com_cnt = n;
}
ococo_unionfind(vector<T> v){
int n = (int)v.size();
g.resize(n);
vec = v;
for(int i = 0; i < n; i++)g[i] = pair(i,1);
com_cnt = n;
}
int ne(int idx){
if(g[idx].first == idx)return idx;
else return g[idx].first = ne(g[idx].first);
}
//(a,b) 間をマージする。既に連結されていたら true,そうでなければ false を返す
bool einsert(int a,int b){
a = ne(a); b = ne(b);
if(a == b)return true;
com_cnt--;
vec[a] = vec[b] = func(vec[a],vec[b]);
if(g[a].second < g[b].second){
g[a].first = b;
g[b].second = max(g[a].second + 1,g[b].second);
}
else{
g[b].first = a;
g[a].second = max(g[b].second + 1,g[a].second);
}
return false;
}
bool peinsert(pair<int,int> p){
return einsert(p.first,p.second);
}
bool is_connect(int a,int b){
return (ne(a) == ne(b));
}
bool pis_connect(pair<int,int> p){
return is_connect(p.first,p.second);
}
//いくつの連結成分に分かれているか出力する
int component_count(void){
return com_cnt;
}
//連結成分に乗せたものを返す
T get_val(int a){
return vec[ne(a)];
}
};
#define MULTI_TEST_CASE false
void solve(void){
//問題を見たらまず「この問題設定から言えること」をいっぱい言う
//一個回答に繋がりそうな解法が見えても、実装や細かい詰めに時間がかかりそうなら別の方針を考えてみる
//添え字回りで面倒になりそうなときは楽になる言い換えを実装の前にじっくり考える
//ある程度考察しても全然取っ掛かりが見えないときは実験をしてみる
//よりシンプルな問題に言い換えられたら、言い換えた先の問題を自然言語ではっきりと書く
//g++ -D_GLIBCXX_DEBUG -O2 b.cpp -o o
int n;
cin >> n;
//t より大きい崖は不満度が X 増える(ちょうど t は問題ない)
ll t;
cin >> t;
ll x,y;
cin >> x >> y;
vector<ll> d(n);
for(int i = 0; i < n; i++)cin >> d[i];
sort(d.begin(),d.end());
vector<int> v(n,1);
ococo_unionfind<int> uf(v);
for(int i = 0; i < n - 1; i++){
if(d[i + 1] - d[i] <= t)uf.einsert(i,i + 1);
}
v.clear();
for(int i = 0; i < n; i++){
if(uf.ne(i) == i)v.push_back(uf.get_val(i));
}
sort(v.rbegin(),v.rend());
ll temp = 0;
for(int i = 0; i < (int)v.size(); i++){
for(int j = 0; j < v[i]; j++)cout << temp << ' ';
temp += min(x,y);
}
cout << el;
return;
}
void calc(void){
return;
}
signed main(void){
cin.tie(nullptr);
ios::sync_with_stdio(false);
calc();
int t = 1;
if(MULTI_TEST_CASE)cin >> t;
while(t--){
solve();
}
return 0;
}
ococonomy1