不理解这个代码为什么能 AC
  • 板块P2709 小B的询问
  • 楼主AC_loveRealNewbie
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/1 02:52
  • 上次更新2023/11/2 16:52:14
查看原帖
不理解这个代码为什么能 AC
186472
AC_loveRealNewbie楼主2023/10/1 02:52
#include <bits/stdc++.h>
using namespace std;
const int N = 51114;
int n, m, k;
struct query
{
	int l, r, id;
};

query q[N];
int a[N];
int ans[N];
int len;
int cs[N];
int tmp;
int lp, rp;

int get(int x)
{
	return x / len;
}

bool cmp(query i, query j)
{
	int ii = get(i.l);
	int jj = get(j.l);
	if(ii != jj)
		return ii < jj;
	return i.r < j.r;
}

void add(int x)
{
	tmp += 2 * cs[x] + 1;
	cs[x] ++;
}

void del(int x)
{
	tmp -= 2 * cs[x] - 1;
	cs[x] --;
}

int main()
{
	cin >> n >> m >> k;
	len = sqrt(m);
	for(int i = 1; i <= n; i = i + 1)
		cin >> a[i];
	for(int i = 1; i <= m; i = i + 1)
	{
		int l, r;
		cin >> l >> r;
		q[i] = (query){l, r, i};
	}
	sort(q + 1, q + 1 + m, cmp);
	for(int i = 1; i <= m; i = i + 1)
	{
		int l = q[i].l;
		int r = q[i].r;
		while(lp < l)
			del(a[lp]), lp ++;
		while(lp > l)
			lp --, add(a[lp]);
		while(rp < r)
			rp ++, add(a[rp]);
		while(rp > r)
			del(a[rp]), rp --;
		ans[q[i].id] = tmp;
	}
	for(int i = 1; i <= m; i = i + 1)
		cout << ans[i] - 1 << "\n";
	return 0;
}

最后的 ans 为啥要减 1 呢

没想明白

2023/10/1 02:52
加载中...