为啥按照左端点排序不可以呢?
查看原帖
为啥按照左端点排序不可以呢?
488371
Lixp楼主2023/4/3 18:25
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1e6 + 10;

int n, m;
int a[N], ans[N];
int tr[N], last[N];
struct Node{
	int l, r;
	int id;
	bool operator < (const Node& t) const{
		if(l != t.l)	return l < t.l;
		return r < t.r;
	};
}p[N];

int lowbit(int x)
{
	return x & -x;
}

void add(int x, int v)
{
	for(int i = x;i < N;i += lowbit(i))
		tr[i] += v;
}

int query(int x)
{
	int res = 0;
	for(int i = x;i;i -= lowbit(i))
		res += tr[i];
	return res;
}

int main()
{
	scanf("%d", &n);
	for(int i = 1;i <= n;i ++ )	scanf("%d", &a[i]);
	scanf("%d", &m);
	for(int i = 1;i <= m;i ++ )	
	{
		int l, r;
		scanf("%d%d", &l, &r);
		p[i] = {l, r, i};
	}
	sort(p + 1, p + 1 + m);
	int j = 1;
	for(int i = 1;i <= m;i ++ )
	{
		for(j;j <= p[i].r;j ++ )
		{
			int v = a[j];
			if(last[v])	add(last[v], -1);
			
			add(j, 1);
			last[v] = j;
		}
		ans[p[i].id] = query(p[i].r) - query(p[i].l - 1);
	}
	for(int i = 1;i <= m;i ++ )	cout << ans[i] << endl;
	return 0;
} 
2023/4/3 18:25
加载中...