关于本题莫队做法
查看原帖
关于本题莫队做法
247269
MSqwq楼主2021/4/14 21:51

莫队可做吗,T了两个点

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm> 
#include<cmath>
#define ll long long
using namespace std;
struct qwe{
	int x,y,id;
}q[2000010];
int n,c,m;
int a[2000010],t[2000010];
int sum,ans[2000010];
int g;
bool cmp(qwe x,qwe y)
{
	if(x.y/g==y.y/g)return x.x<y.x;
	return x.y<y.y;
}
int l=1,r,ql,qr;
void q1(int x)
{
	t[a[x]]++;
	if(t[a[x]]==2)sum++;
}
void q2(int x)
{
	t[a[x]]--;
	if(t[a[x]]==1)sum--;
}
int main()
{
	scanf("%d%d%d",&n,&c,&m);
	g=sqrt(n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&q[i].x,&q[i].y);
		q[i].id=i;
	} 
	sort(q+1,q+1+m,cmp);
	//for(int i=1;i<=m;i++)cout<<q[i].x<<" "<<q[i].y<<endl;
	for(int i=1;i<=m;i++)
	{
		ql=q[i].x,qr=q[i].y;
		while(l>ql)q1(--l);
		while(l<ql)q2(l++);
		while(r>qr)q2(r--);
		while(r<qr)q1(++r);
		ans[q[i].id]=sum;
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

2021/4/14 21:51
加载中...