我连莫队都不会写了/kk
查看原帖
我连莫队都不会写了/kk
224978
optimize_2楼主2020/9/9 20:05

RT

#include<bits/stdc++.h>
using namespace std;

int n,m,k;
int l,r;
int a[50010];

int nl,nr,sum;
int c[1010];

void addl() {
	sum-=2*c[a[nl]]-1;
	c[a[nl]]--;
	nl++;
}

void addr() {
	nr++;
	c[a[nr]]++;
	sum+=2*c[a[nr]]-1;
}

void minl() {
	nl--;
	c[a[nl]]++;
	sum+=2*c[a[nl]]-1;
}

void minr() {
	sum-=2*c[a[nr]]-1;
	c[a[nr]]--;
	nr--;
}

struct query {
	int l,r,id,ans;
}q[50010];

int belong[50010];

bool cmp1(query a,query b) {
	if(belong[a.l]!=belong[b.l]) return belong[a.l]<belong[b.l];
	else return a.r<b.r;
}

bool cmp2(query a,query b) {
	return a.id<b.id;
}


int main() {
	scanf("%d%d%d",&n,&m,&k);
	int s=sqrt(n);
	for(int i=1;i<=s;i++) {
		for(int j=1;j<=s;j++) {
			belong[(i-1)*s+j]=i;
		}
	}
	for(int i=s*s;i<=n;i++) belong[i]=s+1;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) {
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
	}
	nl=1;
	nr=1;
	c[a[1]]=1;
	sum=1;
	sort(q+1,q+m+1,cmp1);
	for(int i=1;i<=m;i++) {
		while(nl<q[i].l) addl();
		while(nl>q[i].l) minl();
		while(nr>q[i].r) minr();
		while(nr<q[i].r) addr();
		q[i].ans=sum;
	}
	sort(q+1,q+m+1,cmp2);
	for(int i=1;i<=m;i++) {
		cout<<q[i].ans<<endl;
	}
}
2020/9/9 20:05
加载中...