写在前面的话:
跟错榜了,死磕C题,又不懂sg然后就寄了。幸好队友带飞,最后把B题开出来了。最后六题rank18。(这个故事告诉我们不要乱跟榜啊
比赛链接:https://codeforces.com/gym/104385
L
签到题,输出 N − 1 N - 1 N−1,感觉大可不必qwq~
A
签到题,输出 n ≤ s × v n \le s \times v n≤s×v的结果
I
题意:给一棵无向带边权树,有两个操作,第一个操作是让 u − v u - v u−v这条边的边权异或上 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+ai−1−ai ,第二个操作是把它分成 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+ai−1−ai>ai+1 发现他是显然的。既然是递减序列,那么计算这 n n n个数的相邻差,分成 k k k 段,就需要消除掉 k − 1 k - 1 k−1 个相邻数,只需要把最大的删掉即可,也就是相邻差的前 n − k n - k n−k 个数,前缀和处理一下。
#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=(x−i)2+bi 的函数,其中 1 ≤ i ≤ n ≤ 1 0 5 1 \le i \le n \le 10^5 1≤i≤n≤105 有两个操作,第一个操作,给出 x = a x = a x=a,求所有函数的最小值,第二个操作,给出 a , c a, c a,c,增加一条函数 y = ( x − a ) 2 + c y = (x - a)^2 + c y=(x−a)2+c
Solution:因为最大 n ≤ 1 0 5 n \le 10^5 n≤105,求最小值的话,只需要枚举 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