2023 江西省大学生程序设计竞赛

写在前面的话:跟错榜了,死磕C题,又不懂sg然后就寄了。幸好队友带飞,最后把B题开出来了。最后六题rank18。(这个故事告诉我们不要乱跟榜啊

比赛链接:https://codeforces.com/gym/104385

L

签到题,输出 N − 1 N - 1 N1,感觉大可不必qwq~

A

签到题,输出 n ≤ s × v n \le s \times v ns×v的结果

I

题意:给一棵无向带边权树,有两个操作,第一个操作是让 u − v u - v uv这条边的边权异或上 w w w,第二个操作是让所有与 x x x相连的边的边权异或和
Solution:用个数组存一下这个点的答案即可

#include <bits/stdc++.h>
using ll = long long;

int main() {

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n, m;

	std::cin >> n >> m;

	std::vector<int> val(n);

	for (int i = 0; i < n - 1; i ++) {
		int u, v, w;
		std::cin >> u >> v >> w;
		u --;
		v --;
		val[u] ^= w;
		val[v] ^= w;
	}

	while (m --) {
		int op;
		std::cin >> op;
		if (op == 1) {
			int u, v, w;
			std::cin >> u >> v >> w;
			u --;
			v --;
			val[u] ^= w;
			val[v] ^= w;
		} else {
			int x;
			std::cin >> x;
			x --;
			std::cout << val[x] << "\n";
		}
	}
	
	return 0;
}

K

题意:有一个长度为 n n n的递减序列,有两个操作,第一个操作是让 a i = a i + 1 + a i − 1 − a i a_i = a_{i+1} + a_{i-1} - a_i ai=ai+1+ai1ai ,第二个操作是把它分成 k k k 个线段,每个线段的价值是线段内的极差,求出怎么分使得价值和最小。
Solution:首先,它经过操作后仍然是递减序列,对于 a i = a i + 1 + a i − 1 − a i > a i + 1 a_i = a_{i+1} + a_{i-1} - a_i > a_{i+1} ai=ai+1+ai1ai>ai+1 发现他是显然的。既然是递减序列,那么计算这 n n n个数的相邻差,分成 k k k 段,就需要消除掉 k − 1 k - 1 k1 个相邻数,只需要把最大的删掉即可,也就是相邻差的前 n − k n - k nk 个数,前缀和处理一下。

#include <bits/stdc++.h>
using ll = long long;

int main() {

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n;
	std::cin >> n;

	std::vector<int> a(n), b;

	for (int i = 0; i < n; i ++) {
		std::cin >> a[i];
		if (i - 1 >= 0)
			b.push_back(a[i - 1] - a[i]);
	}

	sort(b.begin(), b.end());

	std::vector<ll> s(n);

	for (int i = 0; i < n - 1; i ++)
		s[i + 1] = s[i] + b[i];

	int q;
	std::cin >> q;
	while (q --) {
		int op, k;
		std::cin >> op >> k;
		if (op == 1) {
			std::cout << s[n - k] << "\n";
		}
	}
	
	return 0;
}

J

题意:给你 n n n 个形如 y = ( x − i ) 2 + b i y = (x - i)^2 + b_i y=(xi)2+bi 的函数,其中 1 ≤ i ≤ n ≤ 1 0 5 1 \le i \le n \le 10^5 1in105 有两个操作,第一个操作,给出 x = a x = a x=a,求所有函数的最小值,第二个操作,给出 a , c a, c a,c,增加一条函数 y = ( x − a ) 2 + c y = (x - a)^2 + c y=(xa)2+c
Solution:因为最大 n ≤ 1 0 5 n \le 10^5 n105,求最小值的话,只需要枚举 n \sqrt n n 内的函数就行,第二个操作只需对原有的函数对 b i b_i bi 取个min就行,因为要求最小值。

#include <bits/stdc++.h>
using ll = long long;

int main() {

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n;
	std::cin >> n;

	std::vector<int> b(n + 1);

	for (int i = 1; i <= n; i ++) {
		std::cin >> b[i];
	}

	int m;
	std::cin >> m;

	int B = std::sqrt(n);

	while (m --) {
		int op;
		std::cin >> op;
		if (not op) {
			int a, c;
			std::cin >> a >> c;
			b[a] = std::min(b[a], c);
		} else {
			int a;
			std::cin >> a;
			int l = std::max(1, a - B - 1);
			int r = std::min(n, a + B + 1);
			int ans = 1E9;
			for (int i = l; i <= r; i ++) {
				ans = std::min(ans, (a - i) * (a - i) + b[i]);
			}
			std::cout << ans << "\n";
		}
	}
	
	return 0;
}

B

队友写的,还不会qwq

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W⁡angduoyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值