蒟蒻莫队WA在了第三个点上
查看原帖
蒟蒻莫队WA在了第三个点上
950927
_luo_gu楼主2024/1/19 17:17

可过样例

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std ;
int N , a[200005] , cnt[200005] , belong[200005] , siz , ans[200005] , m ;
struct query{
	int l ;
	int r ;
	int id ;
};
query q[200005] ;
bool cmp(query a , query b ){
	return belong[a.id] == belong[b.id] ? a.r < b.r : a.l < b.l ;
}
signed main(){
	scanf("%lld%lld" , &N , &m );
	for( int i = 1 ; i <= N ; ++ i ){
		scanf("%lld" , &a[i] );
	}
	siz = sqrt(N);
	for( int i = 1 ; i <= m ; ++ i ){
		scanf("%lld%lld" , &q[i].l , &q[i].r );
		q[i].id = i ;
		belong[i] = ceil(q[i].l/siz);
	}
	sort(q+1 , q+m+1 , cmp );
	int l = 1 ;
	int r = 0 ;
	int an = 0;
	for( int i = 1 ; i <= m ; ++ i ){
		int ql = q[i].l ;
		int qr = q[i].r ;
		while( l > ql ) cnt[a[-- l]] ++ , an += ( cnt[a[l]] * 2 - 1 )*a[l];
		while( r < qr ) cnt[a[++ r]] ++ , an += ( cnt[a[r]] * 2 - 1 )*a[r];
		while( l < ql ) cnt[a[l]] -- , an -=(cnt[a[l++]] * 2 + 1)*a[l] ;
		while( r > qr ) cnt[a[r]] -- , an -=(cnt[a[r--]] * 2 + 1)*a[r] ;
		ans[q[i].id] = an ;
	}
	for( int i = 1 ; i <= m ; ++ i ){
		printf("%lld\n",ans[i]);
	}
	return 0 ;
}

test3:

20 8
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
4 15
1 2
2 20
7 7
13 18
7 7
3 19
3 8

正确输出:

108
3
281
1
27
1
209
27

感谢大佬!好人一生平安!

2024/1/19 17:17
加载中...