結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
mgingin142857
|
| 提出日時 | 2020-08-14 22:05:29 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,827 bytes |
| コンパイル時間 | 1,638 ms |
| コンパイル使用メモリ | 171,656 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-10-10 15:20:56 |
| 合計ジャッジ時間 | 7,002 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 36 WA * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define fi first
#define se second
typedef pair<ll, ll> P;
using VP = vector<P>;
using VVP = vector<VP>;
using VI = vector<ll>;
using VVI = vector<VI>;
using VVVI = vector<VVI>;
const int inf = 1e9 + 7;
const ll INF = 1LL << 61;
const ll mod = 1e9 + 7;
template <class T> inline bool chmax(T &a, T b) {
if (a < b) {
a = b;
return true;
}
return false;
}
template <class T> inline bool chmin(T &a, T b) {
if (a > b) {
a = b;
return true;
}
return false;
}
struct UnionFind {
vector<int> data;
UnionFind(int sz) { data.assign(sz, -1); }
bool unite(int x, int y) {
x = find(x), y = find(y);
if (x == y) return (false);
if (data[x] > data[y]) swap(x, y);
data[x] += data[y];
data[y] = x;
return (true);
}
int find(int k) {
if (data[k] < 0) return (k);
return (data[k] = find(data[k]));
}
int size(int k) { return (-data[find(k)]); }
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int i, j;
int n, a, b;
cin >> n >> a >> b;
int x[n];
for (i = 0; i < n; i++) {
cin >> x[i];
}
UnionFind uf(n);
int l = 0;
int r = -1;
while (1) {
r++;
if (x[r] - x[l] >= a && x[r] - x[l] <= b) uf.unite(l, r);
while (r + 1 < n && x[r + 1] - x[l] <= b) {
r++;
if (x[r] - x[l] >= a) uf.unite(l, r);
}
while (l + 1 < n && x[r] - x[l + 1] >= a) {
l++;
if (x[r] - x[l] <= b) uf.unite(l, r);
}
//cout << l << " " << r << endl;
if (l == n - 1) break;
}
for (i = 0; i < n; i++) {
cout << uf.size(i) << endl;
}
}
mgingin142857