社区讨论

关于long long

P2709【模板】莫队 / 小B的询问参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhj13hz7
此快照首次捕获于
2025/11/03 19:00
4 个月前
此快照最后确认于
2025/11/03 19:00
4 个月前
查看原帖
我认为如果数列的数都是一样的,那么区间 [1,n]\begin{bmatrix}1,n\end{bmatrix} 的答案就是 n2n^2,最大为 500002=250000000050000^2=2500000000,而 2500000000>21474836472500000000>2147483647。可是我忘开 long longAC了。
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,k,ans;
int B;
int a[50005];
int c[50005];
int l = 1,r = 0;
struct node
{
	int l,r,id,ans;
	bool operator<(const node &a)const
	{
		if((l+B-1)/B != (a.l+B-1)/B)
		{
			return (l+B-1)/B < (a.l+B-1)/B;
		}
		return r < a.r;
	}
};
node qr[50005];
void adr()
{
	r++;
	c[a[r]]++;
	ans += 2*c[a[r]]-1;
	return;
}
void adl()
{
	l--;
	c[a[l]]++;
	ans += 2*c[a[l]]-1;
	return;
}
void der()
{
	c[a[r]]--;
	ans -= 2*c[a[r]]+1;
	r--;
	return;
}
void del()
{
	c[a[l]]--;
	ans -= 2*c[a[l]]+1;
	l++;
	return;
}
bool cmp(node x,node y)
{
	return x.id < y.id;
}
int main()
{
	cin >> n >> m >> k;
	B = sqrt(n);
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	for(int i = 1;i <= m;i++)
	{
		cin >> qr[i].l >> qr[i].r;
		qr[i].id = i;
	}
	sort(qr+1,qr+m+1);
	for(int i = 1;i <= m;i++)
	{
		while(r < qr[i].r)
		{
			adr();
		}
		while(r > qr[i].r)
		{
			der();
		}
		while(l > qr[i].l)
		{
			adl();
		}
		while(l < qr[i].l)
		{
			del();
		}
		qr[i].ans = ans;
	}
	sort(qr+1,qr+m+1,cmp);
	for(int i = 1;i <= m;i++)
	{
		cout << qr[i].ans << "\n";
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...