Submission #73109382
Source Code Expand
#include<bits/stdc++.h>
#define LL long long
#define PII pair<int, int>
#define PLI pair<LL, int>
#define PLL pair<LL, LL>
using namespace std;
const int N = 4e5, inf = 1e9, LOG = 20;
int n;
struct SGT {
struct node {
int l, r, lc, rc, mi, mx;
};
int ret;
vector<node> tree;
inline void init() {
tree.clear(); ret = 0;
tree.push_back({0, 0, 0, 0, n + 1, 0});
}
inline void update(int pos, int v, int &id, int l = 1, int r = inf) {
if (pos < l || r < pos) return;
int mid = (l + r) >> 1, h = id;
if (id == 0) {
// if (l != 1 || r != inf) cerr << tree[1].lc << " " << tree[1].rc << "\n";
h = id = tree.size();
// if (l != 1 || r != inf) cerr << id << " " << tree[1].lc << " " << tree[1].rc << " " << l << " " << r << " " << pos << " " << v << " ok\n";
tree.push_back({l, r, 0, 0, v, v});
}
if (l == r) {
tree[h].mi = min(tree[h].mi, v);
tree[h].mx = max(tree[h].mx, v);
// cerr << h << " " << l << " " << r << " " << tree[id].mi << " " << tree[id].mx << " val\n";
return;
}
update(pos, v, tree[h].lc, l, mid);
update(pos, v, tree[h].rc, mid + 1, r);
tree[h].mi = min(tree[tree[h].lc].mi, tree[tree[h].rc].mi);
tree[h].mx = max(tree[tree[h].lc].mx, tree[tree[h].rc].mx);
}
PII query(const int z, const int y, int id) {
if (id == 0 || y < tree[id].l || tree[id].r < z) return {0, n + 1};
// cerr << z << " " << y << " " << id << " " << tree[id].mi << " " << tree[id].mx << "\n";
int l = tree[id].l, r = tree[id].r;
if (z <= l && r <= y) return {tree[id].mx, tree[id].mi};
PII a = query(z, y, tree[id].rc), b = query(z, y, tree[id].lc);
// cout << a.first << " " << b.first << " " << tree[id].lc << " " << tree[id].rc << " no\n";
return {max(a.first, b.first), min(a.second, b.second)};
}
}f, g;
int st1[LOG + 5][N + 5], st2[LOG + 5][N + 5], lg[N + 5];
inline PII getval(int l, int r) {
if (l > r) return {0, n + 1};
int len = r - l + 1;
PII ret;
ret.first = max(st1[lg[len]][l], st1[lg[len]][r - (1 << lg[len]) + 1]);
ret.second = min(st2[lg[len]][l], st2[lg[len]][r - (1 << lg[len]) + 1]);
return ret;
}
inline void solve() {
int d; cin >> n >> d;
vector<int> a(n + 5), l(n + 5), r(n + 5);
for (int i = 1; i <= n; i++) cin >> a[i];
lg[1] = 0;
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
f.init();
for (int i = 1; i <= n; i++) {
l[i] = f.query(max(1, a[i] - d + 1), min(inf, a[i] + d - 1), f.ret).first;
f.update(a[i], i, f.ret);
st1[0][i] = l[i];
}
g.init();
for (int i = n; i >= 1; --i) {
r[i] = g.query(max(1, a[i] - d + 1), min(inf, a[i] + d - 1), g.ret).second;
g.update(a[i], i, g.ret);
st2[0][i] = r[i];
}
// for (int i = 1; i <= n; i++) cout << i << ": " << l[i] << " " << r[i] << "\n";
for (int i = 1; i <= LOG; i++) {
for (int j = 1; j <= n; j++) {
st1[i][j] = max(st1[i - 1][j], st1[i - 1][min(n, j + (1 << (i - 1)))]);
st2[i][j] = min(st2[i - 1][j], st2[i - 1][min(n, j + (1 << (i - 1)))]);
// cout << i << " " << j << " " << st1[i][j] << " " << st2[i][j] << "\n";
}
}
LL ans = 0;
for (int i = 1; i <= n; i++) {
int l = i, r = n, pos = i;
while (l <= r) {
int mid = (l + r) >> 1;
PII val = getval(i, mid);
// cout << i << " " << l << " " << r << " " << mid << " " << val.first << " " << val.second << "\n";
if (val.first < i && val.second > mid) pos = mid, l = mid + 1;
else r = mid - 1;
}
ans += pos - i + 1;
}
cout << ans << "\n";
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t = 1;
//cin >> t;
while (t--) solve();
return 0;
}
Submission Info
| Submission Time |
|
| Task |
E - Sparse Range |
| User |
C202627yehan |
| Language |
C++23 (GCC 15.2.0) |
| Score |
450 |
| Code Size |
3643 Byte |
| Status |
AC |
| Exec Time |
1795 ms |
| Memory |
325676 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
450 / 450 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
| All |
min1.txt, min2.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, sample_01.txt, sample_02.txt, sample_03.txt |
| Case Name |
Status |
Exec Time |
Memory |
| min1.txt |
AC |
2 ms |
3832 KiB |
| min2.txt |
AC |
1 ms |
3736 KiB |
| random_01.txt |
AC |
1343 ms |
325676 KiB |
| random_02.txt |
AC |
1141 ms |
307900 KiB |
| random_03.txt |
AC |
1336 ms |
325568 KiB |
| random_04.txt |
AC |
1161 ms |
310660 KiB |
| random_05.txt |
AC |
1443 ms |
325632 KiB |
| random_06.txt |
AC |
755 ms |
188828 KiB |
| random_07.txt |
AC |
1776 ms |
325652 KiB |
| random_08.txt |
AC |
1190 ms |
234560 KiB |
| random_09.txt |
AC |
1795 ms |
325636 KiB |
| random_10.txt |
AC |
1057 ms |
213060 KiB |
| random_11.txt |
AC |
964 ms |
253724 KiB |
| random_12.txt |
AC |
213 ms |
108576 KiB |
| random_13.txt |
AC |
314 ms |
75148 KiB |
| random_14.txt |
AC |
1318 ms |
325592 KiB |
| random_15.txt |
AC |
1312 ms |
325612 KiB |
| random_16.txt |
AC |
1312 ms |
325592 KiB |
| sample_01.txt |
AC |
2 ms |
3700 KiB |
| sample_02.txt |
AC |
1 ms |
3752 KiB |
| sample_03.txt |
AC |
1 ms |
3800 KiB |