結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
Example0911
|
| 提出日時 | 2020-08-14 22:11:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,090 bytes |
| コンパイル時間 | 1,652 ms |
| コンパイル使用メモリ | 173,640 KB |
| 実行使用メモリ | 8,064 KB |
| 最終ジャッジ日時 | 2024-10-10 15:29:26 |
| 合計ジャッジ時間 | 7,299 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 1 WA * 36 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
// コンテスト中のみ
#define int long long
#define ll long long
#define rep(i,n) for(int i = 0; i < (n); i++)
#define P pair<ll,ll>
int MOD = 1000000007;
const ll INF = 1LL << 60;
class UnionFind {
public:
vector <ll> par; // 各元の親を表す配列
vector <ll> siz; // 素集合のサイズを表す配列(1 で初期化)
// Constructor
UnionFind(ll sz_) : par(sz_), siz(sz_, 1) {
for (ll i = 0; i < sz_; ++i) par[i] = i; // 初期では親は自分自身
}
void init(ll sz_) {
par.resize(sz_);
siz.resize(sz_, 1);
for (ll i = 0; i < sz_; ++i) par[i] = i; // 初期では親は自分自身
}
// Member Function
// Find
ll root(ll x) { // 根の検索
while (par[x] != x) {
x = par[x] = par[par[x]]; // x の親の親を x の親とする
}
return x;
}
// Union(Unite, Merge)
bool merge(ll x, ll y) {
x = root(x);
y = root(y);
if (x == y) return false;
// merge technique(データ構造をマージするテク.小を大にくっつける)
if (siz[x] < siz[y]) swap(x, y);
siz[x] += siz[y];
par[y] = x;
return true;
}
bool issame(ll x, ll y) { // 連結判定
return root(x) == root(y);
}
ll size(ll x) { // 素集合のサイズ
return siz[root(x)];
}
};
int N, A, B;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> A >> B;
vector<int>x(N);
rep(i, N)cin >> x[i];
UnionFind uf(N);
rep(i, N) {
auto ra = lower_bound(x.begin() + i, x.end(), x[i] + A);
auto rb = upper_bound(x.begin() + i, x.end(), x[i] + B); rb--;
if (ra != x.end()) {
if (ra - x.begin() > rb - x.begin()) {
}
else {
uf.merge(i, ra - x.begin());
uf.merge(i, rb - x.begin());
}
}
auto la = upper_bound(x.begin(), x.begin() + i, -A + x[i]);
if (la != x.begin()) {
la--;
auto lb = lower_bound(x.begin(), x.begin() + i, -B + x[i]);
if (la - x.begin() > lb - x.begin()) {}
else {
uf.merge(i, la - x.begin());
uf.merge(i, lb - x.begin());
}
}
}
rep(i, N) {
cout << uf.size(i) << endl;
}
return 0;
}
Example0911