結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-08-14 21:48:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 8,537 bytes |
| コンパイル時間 | 3,155 ms |
| コンパイル使用メモリ | 169,788 KB |
| 最終ジャッジ日時 | 2025-01-12 23:36:32 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 1 |
| other | AC * 8 WA * 29 |
ソースコード
//include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <unordered_map>
#include <climits>
#include <set>
#include <unordered_set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <queue>
#include <random>
#include <chrono>
#include <complex>
#include <regex>
#include <locale>
#include <random>
#include <cassert>
#include <type_traits>
using namespace std;
// typedef
//------------------------------------------
typedef long long LL;
typedef vector<int> VI;
typedef vector<bool> VB;
typedef vector<char> VC;
typedef vector<double> VD;
typedef vector<string> VS;
typedef vector<LL> VLL;
typedef vector<VI> VVI;
typedef vector<VB> VVB;
typedef vector<VS> VVS;
typedef vector<VLL> VVLL;
typedef vector<VVI> VVVI;
typedef vector<VVLL> VVVLL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef pair<int, string> PIS;
typedef pair<string, int> PSI;
typedef pair<string, string> PSS;
typedef vector<PII> VPII;
typedef vector<PLL> VPLL;
typedef vector<VPII> VVPII;
typedef vector<VPLL> VVPLL;
typedef vector<VS> VVS;
typedef map<int, int> MII;
typedef map<LL, LL> MLL;
typedef map<string, int> MSI;
typedef map<int, string> MIS;
// container util
//------------------------------------------
typedef int pInt[4];
#define ALL(a) (a).begin(),(a).end()
#define SZ(a) int((a).size())
#define EACH(i, arr) for(typeof((arr).begin()) i=(arr).begin(); i!=(arr).end(); ++i)
#define EXIST(str, e) ((str).find(e)!=(str).end())
#define COUNT(arr, v) count((arr).begin(), (arr).end(), v)
#define SEARCH(v, w) search((v).begin(), (v).end(), (w).begin(), (w).end())
#define SORT(c) sort((c).begin(),(c).end())
#define RSORT(c) sort((c).rbegin(),(c).rend())
#define REVERSE(c) reverse((c).begin(), (c).end())
#define ROTATE_LEFT(arr, c) rotate((arr).begin(), (arr).begin()+(c), (arr).end())
#define ROTATE_RIGHT(arr, c) rotate((arr).rbegin(), (arr).rbegin() + (c), (arr).rend())
#define SUMI(arr) accumulate((arr).begin(), (arr).end(), 0)
#define SUMD(arr) accumulate((arr).begin(), (arr).end(), 0.)
#define SUMLL(arr) accumulate((arr).begin(), (arr).end(), 0LL)
#define MULD(arr) accumulate((arr).begin(), (arr).end(), 1., multiplies<double>())
#define UB(arr, n) upper_bound((arr).begin(), (arr).end(), n)
#define LB(arr, n) lower_bound((arr).begin(), (arr).end(), n)
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
// input output
//------------------------------------------
#define GL(s) getline(cin, (s))
#define INIT() std::ios::sync_with_stdio(false);std::cin.tie(0)
#define OUT(d) std::cout<<(d)
#define OUT_L(d) std::cout<<(d)<<endl
#define FOUT(n, data) std::cout<<std::fixed<<std::setprecision(n)<<(data)
#define FOUT_L(n, data) std::cout<<std::fixed<<std::setprecision(n)<<(data)<<"\n"
#define EL() printf("\n")
#define SHOW_VECTOR(v) {std::cerr << #v << "\t:";for(const auto& xxx : v){std::cerr << xxx << " ";}std::cerr << "\n";}
#define SHOW_MAP(v) {std::cerr << #v << endl; for(const auto& xxx: v){std::cerr << xxx.first << " " << xxx.second << "\n";}}
#define Yes() printf("Yes\n")
#define No() printf("No\n")
#define YES() printf("YES\n")
#define NO() printf("NO\n")
#define Yay() printf("Yay!\n")
#define Nnn() printf(":(\n")
#define CE(x, y) ((x + y - 1) / (y))
template<typename T1, typename T2>
istream &operator>>(istream &in, pair<T1, T2> &p) {
in >> p.first >> p.second;
return in;
}
template<typename T>
istream &operator>>(istream &in, vector<T> &v) {
for (auto &x: v)
in >> x;
return in;
}
template<typename T1, typename T2>
ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
out << "[" << p.first << ", " << p.second << "]" << "\n";
return out;
}
template<class T1, class T2>
inline bool chmin(T1 &a, T2 b) {
if (a > b) {
a = b;
return true;
}
return false;
}
template<class T1, class T2>
inline bool chmax(T1 &a, T2 b) {
if (a < b) {
a = b;
return true;
}
return false;
}
//repetition
//------------------------------------------
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define RFOR(i, a, b) for(int i=(b)-1;i>=(a);--i)
#define REP(i, n) FOR(i,0,n)
#define RREP(i, n) for(int i = n-1;i >= 0;i--)
#define FORLL(i, a, b) for(LL i=LL(a);i<LL(b);++i)
#define RFORLL(i, a, b) for(LL i=LL(b)-1;i>=LL(a);--i)
#define REPLL(i, n) for(LL i=0;i<LL(n);++i)
#define RREPLL(i, n) for(LL i=LL(n)-1;i>=0;--i)
#define FOREACH(x, arr) for(auto &(x) : (arr))
// Option + Control + K Terminal
// Command + Control + K Run
// Command + b EOF
//------------------------------------------
//------------------------------------------
struct UnionFind {
vector<int> par;
vector<int> sizes;
UnionFind(int n)
: par(n), sizes(n, 1) {
for (int i = 0; i < n; i++) {
par[i] = i;
}
}
int find(int x) {
return x == par[x] ? x : par[x] = find(par[x]);
}
bool unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return false;
if (sizes[x] < sizes[y]) swap(x, y);
par[y] = x;
sizes[x] += sizes[y];
return true;
}
bool same(int x, int y) {
return find(x) == find(y);
}
int get_size(int x) {
return sizes[find(x)];
}
bool all_same() {
bool good = true;
for (int i = 0, n = par.size(); i < n; i++) if (find(0) != find(i)) good = false;
return good;
}
int get_connectivity() {
set<int> s;
for (int i = 0, n = par.size(); i < n; i++) s.insert(find(i));
return s.size();
}
};
constexpr LL INF = 1e16;
struct LazySegmentTree {
private:
LL n;
vector<LL> node, lazy;
vector<bool> lazyFlag;
public:
LazySegmentTree(vector<LL> v) {
LL sz = (LL) v.size();
n = 1;
while (n < sz) n *= 2;
node.resize(2 * n - 1);
lazy.resize(2 * n - 1, INF);
lazyFlag.resize(2 * n - 1, false);
for (LL i = 0; i < sz; i++) node[i + n - 1] = v[i];
for (LL i = n - 2; i >= 0; i--) node[i] = min(node[i * 2 + 1], node[i * 2 + 2]);
}
void lazyEvaluate(LL k, LL l, LL r) {
if (lazyFlag[k]) {
node[k] = min(node[k], lazy[k]);
if (r - l > 1) {
lazy[k * 2 + 1] = min(lazy[k * 2 + 1], lazy[k]);
lazy[k * 2 + 2] = min(lazy[k * 2 + 2], lazy[k]);
lazyFlag[k * 2 + 1] = lazyFlag[k * 2 + 2] = true;
}
lazyFlag[k] = false;
}
}
void update(LL a, LL b, LL x, LL k = 0, LL l = 0, LL r = -1) {
if (r < 0) r = n;
lazyEvaluate(k, l, r);
if (b <= l || r <= a) return;
if (a <= l && r <= b) {
lazy[k] = min(lazy[k], x);
lazyFlag[k] = true;
lazyEvaluate(k, l, r);
} else {
update(a, b, x, 2 * k + 1, l, (l + r) / 2);
update(a, b, x, 2 * k + 2, (l + r) / 2, r);
node[k] = min(node[2 * k + 1], node[2 * k + 2]);
}
}
LL find(LL a, LL b, LL k = 0, LL l = 0, LL r = -1) {
if (r < 0) r = n;
lazyEvaluate(k, l, r);
if (b <= l || r <= a) return INF;
if (a <= l && r <= b) return node[k];
LL vl = find(a, b, 2 * k + 1, l, (l + r) / 2);
LL vr = find(a, b, 2 * k + 2, (l + r) / 2, r);
return min(vl, vr);
}
};
int main() {
int N, A, B;
cin >> N >> A >> B;
vector<int> x(N);
cin >> x;
vector<LL> v(N);
iota(v.begin(), v.end(), 0);
LazySegmentTree tree(v);
for (int i = 0; i < N; i++) {
LL l = x[i] + A;
LL r = x[i] + B;
LL lpos = lower_bound(x.begin(), x.end(), l) - x.begin();
LL rpos = upper_bound(x.begin(), x.end(), r) - x.begin();
tree.update(lpos, rpos, tree.find(i, i + 1));
}
UnionFind UF(N);
VVLL dp(N);
for (int i = 0; i < N; i++) {
int val = tree.find(i, i + 1);
dp[val].push_back(i);
}
for (auto arr: dp) {
for (int i = 0; i < (int)arr.size() - 1; i++) {
UF.unite(arr[i], arr[i + 1]);
}
}
for (int i = 0; i < N; i++) cout << UF.get_size(i) << endl;
return 0;
}