蒟蒻分块12pts求调!
查看原帖
蒟蒻分块12pts求调!
700122
hnxxwpf楼主2024/9/11 20:40
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1e6 + 1, maxs = 1e3 + 1;
int n, m, sum, x, y, size, num, vis[maxn], a[maxn], l[maxn], r[maxn], belong[maxn], s[maxs][maxs], st[maxs], ed[maxs], last[maxn];
int main(){ 
	scanf("%d", &n);
	fill(r, r + 1 + maxn, n + 1);
	size = pow(n, 0.5);
	num = ceil(n / size);
	for(int i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		l[i] = last[a[i]];
		r[l[i]] = i;
		last[a[i]] = i;
	}
	for(int i = 1; i <= num; ++i)
	{
		st[i] = ed[i - 1] + 1;
		ed[i] = min(n, i * size);
		fill(vis, vis + 1 + maxs, 0);
		for(int j = st[i]; j <= ed[i]; ++j)
		{
			belong[j] = i;
			s[i][i] += !vis[a[j]]++;
		}
	}
	for(int i = 1; i < num; ++i)
	{
		for(int j = 1; i + j <= num; ++j)
		{
			s[i][i + j] = s[i][i + j - 1];
			for(int k = st[i + j]; k <= ed[i + j]; ++k)
			{
				s[i][i + j] += l[k] < st[i];
			}
		}
	}
	scanf("%d", &m);
	while(m--)
	{
		scanf("%d %d", &x, &y);
		int sum = s[belong[x] + 1][belong[y] - 1];
		if(belong[y] - belong[x] <= 1)
		{
			fill(vis, vis + 1 + maxs, 0);
			for(int i = x; i <= y; ++i)
			{
				sum += !vis[a[i]]++;
			}
			printf("%d\n", sum);
			continue;
		}
		for(int i = x; i <= ed[belong[x]]; ++i)
		{
			sum += r[i] > y;
		}
		for(int i = st[belong[y]]; i <= y; ++i)
		{
			sum += l[i] < st[belong[x] + 1];
		}
		printf("%d\n", sum);
	}
	return 0;
}

2024/9/11 20:40
加载中...