莫队又过了
查看原帖
莫队又过了
359952
_lbw_malerlee楼主2020/11/26 14:32

rt,在块长=2135的情况下艹过了

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
namespace stO_cyx_Orz{
	#define ll long long
	static char buf[100000],*b=buf,*d=buf;
	#define gc b==d&&(d=(b=buf)+fread(buf,1,100000,stdin),b==d)?EOF:*b++	
	ll read(){ll ans=0,f=1;char c1=gc;while(c1<'0'||c1>'9'){if(c1=='-')f=-1;c1=gc;}while(c1>='0'&&c1<='9')ans=ans*10+c1-'0',c1=gc;return ans*f;}
	const int maxn = 1e6+5;
	int n,m,siz,block,belong[maxn];
	int cnt[maxn],a[maxn],l,r,ans,q[maxn];
	struct node{
		int l,r,x;
		int ans;
	}qwq[maxn];
	bool cmp(node a,node b){return (belong[a.l]^belong[b.l])?(belong[a.l]<belong[b.l]):((belong[a.l]&1)?a.r<b.r:a.r>b.r);}
	int mian(){
		n=read();
		for(int i=1;i<=n;++i)a[i]=read();m=read();
		for(int i=1;i<=m;i++)qwq[i].l=read(),qwq[i].r=read(),qwq[i].x=i;
		siz=2135;
		block=ceil(n*1.0/siz);
		for(int i=1;i<=n;i++)belong[i]=(i-1)/siz+1;
//		for(int i=1;i<=n;i++)cout<<belong[i]<<' ';
//		cout<<endl;
		sort(qwq+1,qwq+1+m,cmp);
		l=1;r=0;ans=0;
		for(int i=1;i<=m;i++){
			int ql=qwq[i].l,qr=qwq[i].r;
			while(l<ql)ans-=!--cnt[a[l++]];
			while(l>ql)ans+=!cnt[a[--l]]++;
			while(r<qr)ans+=!cnt[a[++r]]++;
			while(r>qr)ans-=!--cnt[a[r--]];
			q[qwq[i].x]=ans;
		}
		for(int i=1;i<=m;i++)printf("%d\n",q[i]);
		return 0;
	}
}
using namespace stO_cyx_Orz;
int main(){return mian();} 
2020/11/26 14:32
加载中...