CF1102E Monotonic Renumeration

\(\large{题目链接}\)
\(\\\)
\(\Large\textbf{Solution: } \large{首先我的思路是对原序列进行排序离散,然后预处理出每个数字的最右对应数字的下标。然后再扫一遍求出有用的数字个数cnt,答案即为2^{cnt},复杂度\text{O(nlogn)。}\\其实可以\text{O(n),因为值域太大,所以数组开不下,不过可以开vector啊,我当时没想到,STL大法好。}}\)
\(\\\)
\(\Large\textbf{Code: }\)

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 2e5 + 5;
const int p = 998244353;

int a[N], b[N], c[N], pos[N], nxt[N];

int pow(int x, int y) {
	ll a = x, ret = 1;
	for (; y ; y >>= 1, a = (a * a) % p) if (y & 1) ret = (ret * a) % p;
	return ret;
}

int main() {
	ios::sync_with_stdio(false);
	int n, cnt = 0;
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i], b[i] = a[i];
	sort(b + 1, b + 1 + n);
	int q = unique(b + 1, b + 1 + n) - b - 1;
	for (int i = n; i >= 1; --i) {
		c[i] = lower_bound(b + 1, b + 1 + q, a[i]) - b;
		if (!pos[c[i]]) pos[c[i]] = i;
		nxt[c[i]] = pos[c[i]];
	}
	int l = 1;
	for (int i = 1; i <= n; ++i) {
		if (i > l) ++cnt;
		l = max(l, nxt[c[i]]);
	}
	cout << pow(2, cnt);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/Miraclys/p/12689443.html