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
AC × 3
AC × 21
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