社区讨论

救救孩子,活不了了

P1972[SDOI2009] HH 的项链参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi86jg3o
此快照首次捕获于
2025/11/21 09:26
4 个月前
此快照最后确认于
2025/11/21 09:26
4 个月前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

struct X
{
	int l,r,num,ans;
}fi[1000000];

int n,m;

int c[1000000],net[1000000];

int a[1000000];

void add(int x,int y)
{
	for(;x<=n;x+=(x&-x)) c[x]+=y;
}

int ask(int x)
{
	int ans=0;
	for(;x;x-=(x&-x)) ans+=c[x];
	return ans;
}

bool cmp1(X A,X B)
{
	return A.r<B.r;
}

bool cmp2(X A,X B)
{
	return A.num<B.num;
}

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++)
	{
		scanf("%d%d",&fi[i].l,&fi[i].r);
		fi[i].num=i;
	}
	sort(fi+1,fi+m+1,cmp1);
	int cnt=1;
	for(int i=1;i<=n;i++)
	{
		if(net[a[i]]!=0)
			add(net[a[i]],-1);
		add(i,1);
		net[a[i]]=i;
		if(fi[cnt].r==i)
		{
			fi[cnt].ans=ask(fi[cnt].r)-ask(fi[cnt].l-1);
			cnt++;
		}
	}
	sort(fi+1,fi+m+1,cmp2);
	for(int i=1;i<=m;i++)
	{
		printf("%d\n",fi[i].ans);
	}
}

回复

2 条回复,欢迎继续交流。

正在加载回复...