Submission #45345461


Source Code Expand

#include <atcoder/lazysegtree.hpp>
#include <atcoder/modint.hpp>
#ifndef BZ
#pragma GCC optimize "-O3"
#endif
#include <bits/stdc++.h>
#include <atcoder/modint>
#include <atcoder/lazysegtree>

#define ALL(v) (v).begin(), (v).end()
#define rep(i, l, r) for (int i = (l); i < (r); ++i)

using ll = long long;
using ld = long double;
using ull = unsigned long long;

using namespace std;


/*
ll pw(ll a, ll b) {
	ll ans = 1; while (b) {
		while (!(b & 1)) b >>= 1, a = (a * a) % MOD;
		ans = (ans * a) % MOD, --b;
	} return ans;
}
*/

using mint = atcoder::modint998244353;

const int N = 260000;
const int inf = 1e9;

int n, k;

int a[N];

int get_minf() {
	return -inf;
}

int get_pinf() {
	return inf;
}

int add(int x, int y) {
	return x + y;
}

int get_0() {
	return 0;
}

int get_max(int x, int y) {
	return max(x, y);
}

int get_min(int x, int y) {
	return min(x, y);
}

int sz[N];
int mx[N];
int mn[N];
int p[N];

int get(int x) {
	if (p[x] == x) {
		return x;
	}
	p[x] = get(p[x]);
	return p[x];
}

void merge(int x, int y) {
	x = get(x);
	y = get(y);
	if (x == y) {
		return;
	}
	if (sz[x] > sz[y]) {
		swap(x, y);
	}
	p[x] = y;
	sz[y] += sz[x];
	mn[y] = min(mn[y], mn[x]);
	mx[y] = max(mx[y], mx[x]);
}


int main() {
	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cout.setf(ios::fixed), cout.precision(20);
	cin >> n >> k;
	for (int i = 0; i < n; ++i) {
		p[i] = i;
		mn[i] = i;
		mx[i] = i;
		sz[i] = 1;
	}
	vector<int> loc(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
		--a[i];
		loc[a[i]] = i;
	}

	atcoder::lazy_segtree<int, get_max, get_minf, int, add, add, get_0> lx(n - k + 1);
	atcoder::lazy_segtree<int, get_max, get_minf, int, add, add, get_0> rx(n - k + 1);
	atcoder::lazy_segtree<int, get_min, get_pinf, int, add, add, get_0> len(n - k + 1);
	for (int i = 0; i + k <= n; ++i) {
		lx.set(i, i);
		rx.set(i, i + k);
		len.set(i, k);
	}

	atcoder::lazy_segtree<int, get_max, get_minf, int, add, add, get_0> go(n);
	for (int i = 0; i < n; ++i) {
		go.set(i, i);
	}

	mint ans = 1;

	auto find_loc = [&] (int l) {
		return go.max_right(0, [&] (int x) -> bool {
			return x < l;
		});
	};

	for (int val = 0; val < n; ++val) {
		while (len.all_prod() == 2) {
			int x = len.max_right(0, [&](int x) -> bool {
				return x > 2;
			});
			int l = lx.get(x);
			int r = rx.get(x);
			assert(r - l == 2);
			int a = find_loc(l);
			int b = find_loc(l + 1);
			merge(a, b);
			len.set(x, inf);
		}

		int lc = loc[val];
		int l = mn[get(lc)];
		int r = mx[get(lc)];
		l = go.prod(0, l) + 1;
		l = max(l, 0);
		r = go.prod(0, r + 1) + 1;

		ans *= (r - l);
		int lb = lx.max_right(0, [&](int x) -> bool {
			return x < r;
		});
		lx.apply(lb, n - k + 1, -1);
		len.apply(lb, n - k + 1, 1);

		int rb = rx.max_right(0, [&](int x) -> bool {
			return x <= l;
		});
		rx.apply(rb, n - k + 1, -1);
		len.apply(rb, n - k + 1, -1);

		go.set(lc, -inf);
		go.apply(lc + 1, n, -1);
	}

	cout << ans.val() << "\n";

	return 0;
}


Submission Info

Submission Time
Task B - The Greatest Two
User LHiC
Language C++ 20 (gcc 12.2)
Score 1500
Code Size 3123 Byte
Status AC
Exec Time 1000 ms
Memory 22180 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1500 / 1500
Status
AC × 4
AC × 42
Set Name Test Cases
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt, 01-037.txt, 01-038.txt
Case Name Status Exec Time Memory
00-sample-001.txt AC 1 ms 3396 KiB
00-sample-002.txt AC 1 ms 3608 KiB
00-sample-003.txt AC 1 ms 3436 KiB
00-sample-004.txt AC 1 ms 3544 KiB
01-001.txt AC 1 ms 3468 KiB
01-002.txt AC 3 ms 3672 KiB
01-003.txt AC 1 ms 3516 KiB
01-004.txt AC 3 ms 3556 KiB
01-005.txt AC 1 ms 3556 KiB
01-006.txt AC 1 ms 3560 KiB
01-007.txt AC 406 ms 14016 KiB
01-008.txt AC 90 ms 5864 KiB
01-009.txt AC 639 ms 19756 KiB
01-010.txt AC 135 ms 7240 KiB
01-011.txt AC 57 ms 4900 KiB
01-012.txt AC 619 ms 19668 KiB
01-013.txt AC 959 ms 21452 KiB
01-014.txt AC 340 ms 11384 KiB
01-015.txt AC 1000 ms 21400 KiB
01-016.txt AC 756 ms 19868 KiB
01-017.txt AC 902 ms 20616 KiB
01-018.txt AC 725 ms 19808 KiB
01-019.txt AC 224 ms 7692 KiB
01-020.txt AC 45 ms 4336 KiB
01-021.txt AC 39 ms 4440 KiB
01-022.txt AC 551 ms 12760 KiB
01-023.txt AC 547 ms 12760 KiB
01-024.txt AC 427 ms 12248 KiB
01-025.txt AC 138 ms 7276 KiB
01-026.txt AC 77 ms 5380 KiB
01-027.txt AC 821 ms 20304 KiB
01-028.txt AC 38 ms 4264 KiB
01-029.txt AC 96 ms 5448 KiB
01-030.txt AC 257 ms 13148 KiB
01-031.txt AC 919 ms 22168 KiB
01-032.txt AC 998 ms 22180 KiB
01-033.txt AC 514 ms 15728 KiB
01-034.txt AC 441 ms 14424 KiB
01-035.txt AC 701 ms 18156 KiB
01-036.txt AC 702 ms 17988 KiB
01-037.txt AC 685 ms 18032 KiB
01-038.txt AC 693 ms 18168 KiB