站外题求复杂度
查看原帖
站外题求复杂度
537520
DESTRUCTION_3_2_1楼主2023/1/24 22:01

题目链接

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f3f3f3f3f;
const int SZN = 1e5 + 5;
const int SZM = 350; // sqrt(SZN)
int n, l, r, c, num, tot;
int a[SZN], t[SZN], s[SZM], st[SZM], ed[SZM], belong[SZN];
void Down (int x) {
	if (s[x] == INF) return;
	for (int i = st[x]; i <= ed[x]; i++) a[i] = s[x];
	s[x] = INF;
}
int solve (int l, int r, int c) {
	int sid = belong[l], eid = belong[r], ans = 0;
	Down(sid), Down(eid);
	if (sid == eid) {
		for (int i = l; i <= r; i++) {
			if (a[i] == c) ans++;
			else a[i] = c;
		}
		// Sort(sid);
		return ans;
	}
	for (int i = l; belong[i] == sid; i++) {
		if (a[i] == c) ans++;
		else a[i] = c;
	}
	for (int i = sid + 1; i < eid; i++) {
		if (s[i] == c) {
			ans += ed[i] - st[i] + 1;
			continue;
		}
		if (s[i] != INF) {
			s[i] = c;
			continue;
		}
		for (int j = st[i]; j <= ed[i]; j++) 
			if (a[j] == c) ans++;
		s[i] = c;
	}
	for (int i = r; belong[i] == eid; i--) {
		if (a[i] == c) ans++;
		else a[i] = c;
	}
	return ans;
}
signed main(void)
{
	cin >> n;
	tot = num = sqrt(n);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		t[i] = a[i];
	}
	for (int i = 1; i <= tot; i++)
		st[i] = (i - 1) * num + 1, ed[i] = i * num;
	if (num * num != n) {
		tot++;
		st[tot] = num * num + 1;
		ed[tot] = n;
	}
	for (int i = 1; i <= tot; i++) {
		s[i] = INF;
		for (int j = st[i]; j <= ed[i]; j++)
			belong[j] = i;
	}
	for (int i = 1; i <= n; i++) {
		cin >> l >> r >> c;
		if (l > r) swap(l, r);
		cout << solve(l, r, c) << endl;
	}
	return 0;
}


RT,这还能过?我的思路是块内二分,结果块内暴力水过了?

评测记录

2023/1/24 22:01
加载中...