玄关求条
查看原帖
玄关求条
1243587
shiyilang0910楼主2025/8/5 10:25

样例没过,一直输出:

4
5
3
2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k;
vector<array<int,3>>v;
int mp[50005];
int block,id[50005];
int a[50005];
bool cmp(array<int,3> x,array<int,3> y){
	if (id[x[0]]!=id[y[0]]){
		return id[x[0]]<id[y[0]];
	}
	if (id[x[0]]&1){
		return x[1]>y[1];
	}
	return x[1]<y[1];
}
int ans[50005];
int cnt;
void add(int p){
	cnt-=mp[p]*mp[p];
	mp[p]++;
	cnt+=mp[p]*mp[p];
}
void del(int p){
	cnt-=mp[p]*mp[p];
	mp[p]--;
	cnt+=mp[p]*mp[p];
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	block=int(sqrt(n));
	for(int i=1;i<=n;i++){
		id[i]=(i-1)/block+1;
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		v.push_back({x,y,i});
	}
	sort(v.begin(),v.end(),cmp);
	int l=1,r=0;
	for(auto [x,y,z]:v){
		while(l<x){
			del(l++);
		}
		while(l>x){
			add(--l);
		}
		while(r<y){
			add(++r);
		}
		while(r>y){
			del(r--);
		}
		ans[z]=cnt;
	}
	for(int i=1;i<=m;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
}
2025/8/5 10:25
加载中...