比赛 NOIP2025模拟赛1 评测结果 AAAAAAAAAA
题目名称 接竹竿 最终得分 100
用户昵称 梦那边的美好TE 运行时间 0.619 s
代码语言 C++ 内存使用 4.02 MiB
提交时间 2025-11-24 09:49:21
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=2e4+10;
const int B=100; 
int T,n,nxt[N],t[N],a[N],q,to[N],w[N];
void work(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		t[a[i]]=0;
	}
	
	for(int i=n;i>=1;i--){
		nxt[i]=t[a[i]];
		t[a[i]]=i;
	}
	for(int i=1;i<=n;i++){
		int cnt=0,x=i;
		w[i]=0;
		for(int j=1;j<=B;j++){
			if(!nxt[x])break;
			cnt+=nxt[x]-x+1;
			x=nxt[x]+1;
		}
		to[i]=x,w[i]=cnt;
	}
	scanf("%d",&q);
	while(q--){
		int l,r,ans;
		scanf("%d %d",&l,&r);
		ans=r-l+1;
		for(int i=l;i<=r;i++){
			if(to[i]<=r){
				ans-=w[i];
				i=to[i];
			}
			if(nxt[i]&&nxt[i]<=r){
				ans-=nxt[i]-i+1;
				i=nxt[i];
			}
		}
		printf("%d\n",ans);
	}
	return;
}
int main(){
	freopen("bamboo.in","r",stdin); 
	freopen("bamboo.out","w",stdout);
	scanf("%d",&T);
	while(T--)work();
	return 0;
}