BZOJ1878

来自蒟蒻XXJ的做题记录

莫队随便水啊……

·吃瓜群众:不要听楼上的SB说话!他的代码在luogu上A掉了在bzoj RE了

#include<bits/stdc++.h>
using namespace std;
const int MAXK=1000100;
const int MAXN=50010;
const int MAXM=200010;
inline int in(){
	int a(0);char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
	return a;
}
int n,m;
int ans,num[MAXK];
int col[MAXN],al[MAXM],ar[MAXM],rk[MAXM],pos[MAXM],res[MAXM],siz;
bool cmp(int i,int j){
	if(pos[i]==pos[j]) return ar[i]<ar[j];
	return pos[i]<pos[j];
}
void update(int i,int on){
	int c=col[i];
	if(on==1){
		if(!num[c]) ++ans;
		++num[c];
	}
	else{
		--num[c];
		if(!num[c]) --ans;
	}
}
void init(){
	int u=rk[1];
	for(int i=al[u];i<=ar[u];i++)
		update(i,1);
	res[u]=ans;
}
void input(){
	n=in();siz=sqrt(n);
	for(int i=1;i<=n;i++) col[i]=in();
	m=in();
	for(int i=1;i<=m;i++){
		al[i]=in();ar[i]=in();
		rk[i]=i;pos[i]=al[i]/siz;
	}
	sort(rk+1,rk+m+1,cmp);
	init();
}
void xxj(){
	int L=al[rk[1]],R=ar[rk[1]];
	for(int i=2;i<=m;i++){
		int u=rk[i];
		for(;L<al[u];L++) update(L,-1);
		for(;L>al[u];--L) update(L-1,1);
		for(;R>ar[u];--R) update(R,-1);
		for(;R<ar[u];++R) update(R+1,1);
		res[u]=ans;
	}
}
void output(){
	for(int i=1;i<=m;i++) cout<<res[i]<<endl;
}

int main(){
	input();
	xxj();
	output();
	return 0;
}
posted @ 2017-03-27 10:33  Xiaojian_xiang  阅读(134)  评论(0编辑  收藏  举报