蒟蒻刚学莫队求助
查看原帖
蒟蒻刚学莫队求助
398132
爱好MC的蒟蒻楼主2021/9/14 17:22
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
struct md{
	int l,r,id;
}www[50005];
ll n,m,k,a[50005],tong[50005],ans[50005],block,c=0;
inline bool cmp(md a,md b){
	if((a.l-1)/block==(b.l-1)/block) return a.r<b.r;
	return (a.l)/block<(b.l)/block;
}
inline void add(ll x){
	c+=2*tong[x]+1;
	tong[x]++;
	return ;
}
inline void dele(ll x){
	c-=2*tong[x]-1;
	tong[x]--;
	return ;
}
int main(){
	cin >>n>>m>>k;
	ll block=sqrt(n),left,right,ans1=1,ans2=0;
	for(int i=1;i<=n;i++){
		cin >>a[i];
	}
	for(int i=1;i<=m;i++){
		cin >>www[i].l>>www[i].r;
		www[i].id=i;
	}
	sort(www+1,www+1+m,cmp);
	for(int i=1;i<=m;i++){
		left=www[i].l;
		right=www[i].r;
		while(ans1>left) ans1--,add(a[ans1]);
		while(ans2<right) ans2++,add(a[ans2]);
		while(ans1<left) dele(a[ans1]),ans1++;
		while(ans2>right) dele(a[ans2]),ans2--;
		ans[www[i].id]=c;
	}
	for(int i=1;i<=m;i++){
		cout <<ans[i]<<endl;
	}
	return 0;
}

一直RE 求求找下错

2021/9/14 17:22
加载中...