【莫队】【求调】教
  • 板块学术版
  • 楼主LZX_ssfd
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/10/21 21:53
  • 上次更新2023/11/4 02:59:14
查看原帖
【莫队】【求调】教
289436
LZX_ssfd楼主2021/10/21 21:53

题目

因为马上要下机并且没有时间了(这里人多

所以求调教

谢了

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=50005;
int block;
int n,m,k;
int b[N];
int cut[N];
long long cum[N],ans;
struct node {
	int l,r;
	int w;
} a[N];
bool cmp(node x,node y) {
	return (x.r/block)==(y.r/block)?x.l<y.l:x.r<y.r;
}
void del(int x) {
	cut[b[x]]--;
	ans-=2*cut[b[x]]+1;
}
void add(int x) {
	cut[b[x]]++;
	ans+=2*cut[b[x]]-1;
}
int main() {
	scanf("%d%d%d",&n,&m,&k);
	block=sqrt(n);
	for(int i=1; i<=n; i++)scanf("%d",&b[i]);
	for(int i=1; i<=m; i++) {
		scanf("%d%d",&a[i].l,&a[i].r);
		a[i].w=i;
	}
	sort(a+1,a+m+1,cmp);
	int l=1,r=0;
	for(int i=1; i<=m; i++) {
		int ql=a[i].l,qr=a[i].r;
		while(l<ql)del(l++);
		while(l>ql)add(l--);
		while(r<ql)add(r++);
		while(r>ql)del(r--);
		cum[a[i].w]=ans;
	}
	for(int i=1; i<=m; i++)printf("%lld\n",cum[i]);
	return 0;
}
2021/10/21 21:53
加载中...