请求加强数据
查看原帖
请求加强数据
485393
Mikisana楼主2024/10/15 19:03

Rt,数据太弱了,我莫队排序完全有问题900多ms卡过去了。。。(太弱轻喷)


亮点:(算块的时候算的是bool类型)

bool dir( int x )
{
	return ( x - 1 ) / len + 1;
}



#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

#define N 200005
struct node
{
	int l, r;
	int id;
}ask[N];
int n, arr[N], len, lx[N], rx[N], q, ans[N], sum, cnt[N];

bool dir( int x )
{
	return ( x - 1 ) / len + 1;
}
bool cmp( node s1, node s2 )
{
	return dir(s1.l) == dir(s2.l) ? s1.r < s2.r : dir(s1.l) < dir(s2.l);//保证左端点和右端点至少有一个在同一个块内
}
void add( int x )
{
	sum += 1 + 2 * cnt[arr[x]];
	cnt[arr[x]] ++;
}
void del( int x )
{
	sum -= 2 * cnt[arr[x]] - 1;
	cnt[arr[x]] --;
}
int main()
{
	int k = 0;
	scanf( "%d %d %d", &n, &q, &k );
	len = sqrt( n );
	for ( int i = 1; i <= n; i ++ )
	{
		scanf( "%d", &arr[i] );
	}
	for ( int i = 1; i <= q; i ++ )
	{
		scanf( "%d %d", &ask[i].l, &ask[i].r );
		ask[i].id = i;
	}
	sort( ask+1, ask+1+q, cmp );
	int l = 1, r = 0;
	for ( int i = 1; i <= q; i ++ )
	{
		while( l > ask[i].l )
		{
			add( --l );
		}
		while( r < ask[i].r )
		{
			add( ++r );
		}
		while( l < ask[i].l )
		{
			del( l++ );
		}
		while( r > ask[i].r )
		{
			del( r-- );//注意,因为这个值也是要被删除的,所以先减!!
		}
		ans[ask[i].id] = sum;
	}
	for ( int i = 1; i <= q; i ++ )
	{
		printf( "%d\n", ans[i] );
	}
	return 0;
}
2024/10/15 19:03
加载中...