求调
  • 板块灌水区
  • 楼主Louis_lxy
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/6/29 18:06
  • 上次更新2024/6/29 21:02:41
查看原帖
求调
1203411
Louis_lxy楼主2024/6/29 18:06

今天的比赛T2求调或证明思路错误

我的思路是这样的,题目易得是求所有大于它的数减掉它的和,因此考虑维护所有大于它的数的和。然后用权值树状数组求出有多少大于它的数。用和减去数量乘它的积。得到的就是结果,但是subtesk1错了4个,其他都错1个,导致爆0,好奇是思路错误还是代码细节问题。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 1;
int n, q, sum, c[N];
int s[N], cnt[N];

void update1(int u, int k) { for (; u <= n; u += u & -u) s[u] += k; }

void update2(int u, int k) { for (; u <= n; u += u & -u) cnt[u] += k; }

int getsum1(int u)
{
	int sum = 0;
	for (; u; u -= u & -u) sum += s[u];
	return sum;
}

int getsum2(int u)
{
	int s = 0;
	for (; u; u -= u & -u) s += cnt[u];
	return s;
}

int main()
{
	scanf("%d %d", &n, &q);
	for (int i = 1; i <= n; ++i) { int a; scanf("%d", &a); ++c[a]; }
	for (int i = 0; i <= n; ++i) if (c[i]) update1(c[i], c[i]), update2(c[i], 1), ++sum;
	while (q--)
	{
		int op, x;
		scanf("%d %d", &op, &x);
		if (op == 1 && c[x] == 0) ++c[x], update1(c[x], c[x]), update2(c[x], 1), ++sum;
		else if (op == 2 && c[x] == 1) update1(c[x], -c[x]), update2(c[x], -1), --c[x], --sum;
		else if (op == 1) ++c[x], update1(c[x], c[x]), update1(c[x] - 1, -(c[x] - 1)), update2(c[x], 1), update2(c[x] - 1, -1);
		else if (op == 2) update1(c[x], -c[x]), update1(c[x] - 1, c[x] - 1), update2(c[x], -1), update2(c[x] - 1, 1), --c[x];
		else printf("%d\n", max(getsum1(n) - getsum1(x) - (sum - getsum2(x)) * x, 0));
	}
}
2024/6/29 18:06
加载中...