莫队极限卡过了。。。
查看原帖
莫队极限卡过了。。。
246785
阔睡王子楼主2020/11/18 15:21

rt,在半年之后重新打开这道题,发现了以前的常卡的巨丑,于是乎重新加了快读快写,奇偶性优化,位运算优化,吸氧,调整块的大小等奇技淫巧之后发现是有几率在莫队写的很丑的情况下A掉此题的,orz。

#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
const int maxn=1e6+10;
int read()
{
	int x=0;char r=getchar();
	while(!isdigit(r))r=getchar();
	while(isdigit(r)){x=x*10+r-'0';r=getchar();}
	return x;
}
void write(int x) 
{
	if(x/10)write(x/10);
	putchar(x%10+'0');
}
struct node
{int time,l,r,ans;}b[maxn];
int cnt[maxn],n,q,m,ans[maxn],a[maxn];
bool cmp(node a,node b)
{
	int ba=a.l/q,bb=b.l/q;
	return ba!=bb?a.l<b.l:(ba&1?a.r<b.r:a.r>b.r);
}
int main()
{
	n=read();
	q=2000;
	for(int i=1;i<=n;++i)a[i]=read();
	m=read();
	for(int i=1;i<=m;++i)
	{
		b[i].l=read();b[i].r=read();
		b[i].time=i;
	}
	sort(b+1,b+m+1,cmp);
	int sum=0,l=0,r=0;
	for(int i=1;i<=m;++i)
	{
		while(r<b[i].r)if(!(cnt[a[++r]]++))sum++;
		while(r>b[i].r)if(!(--cnt[a[r--]]))sum--;
		while(l<b[i].l)if(!(--cnt[a[l++]]))sum--;
		while(l>b[i].l)if(!(cnt[a[--l]]++))sum++;
		ans[b[i].time]=sum;
	}
	for(int i=1;i<=m;++i)
	{
		write(ans[i]);
		putchar('\n');
	}
}
2020/11/18 15:21
加载中...