Hello 2025
Hello 2025
A. MEX Table
题意:
给出 0 到 n ∗ m − 1 的数字,排列成 n × m 的表格,最大化 ∑ i = 1 n mex ( { a i , 1 , a i , 2 , … , a i , m } ) + ∑ j = 1 m mex ( { a 1 , j , a 2 , j , … , a n , j } ) 给出0到n*m-1的数字,排列成n×m的表格,最大化\sum\limits_{i = 1}^{n} \operatorname{mex}(\{a_{i,1}, a_{i,2}, \ldots, a_{i,m}\}) + \sum\limits_{j = 1}^{m} \operatorname{mex}(\{a_{1,j}, a_{2,j}, \ldots, a_{n,j}\}) 给出0到n∗m−1的数字,排列成n×m的表格,最大化i=1∑nmex({ai,1,ai,2,…,ai,m})+j=1∑mmex({a1,j,a2,j,…,an,j})
思路:
取行列中最大的值
m
,
0
所在的另一行
/
列为
1
,其余均为
0
,最大值
取行列中最大的值m,0所在的另一行/列为1,其余均为0,最大值
取行列中最大的值m,0所在的另一行/列为1,其余均为0,最大值
为
m
+
1
。
为m+1。
为m+1。
AC code:
void solve() {
int n, m; cin >> n >> m;
cout << max(n, m) + 1 << endl;
}
B. Gorilla and the Exam
题意:
定义将数组
b
清空的方式,每次选取任意长度区间并任选一个值
x
将
定义将数组b清空的方式,每次选取任意长度区间并任选一个值x将
定义将数组b清空的方式,每次选取任意长度区间并任选一个值x将
区间中等于
x
的元素删除
;
区间中等于x的元素删除;
区间中等于x的元素删除;
现在可以将数组
b
中最多
k
个元素任意改变,求操作后最少需要多少
现在可以将数组b中最多k个元素任意改变,求操作后最少需要多少
现在可以将数组b中最多k个元素任意改变,求操作后最少需要多少
次操作可以删除数组
b
。
次操作可以删除数组b。
次操作可以删除数组b。
思路:
每次删除操作即删除当前数组中相同的元素,
m
a
p
记录一下不同元
每次删除操作即删除当前数组中相同的元素,map记录一下不同元
每次删除操作即删除当前数组中相同的元素,map记录一下不同元
素的个数,从数量少的元素开始修改即可。
素的个数,从数量少的元素开始修改即可。
素的个数,从数量少的元素开始修改即可。
AC code:
void solve() {
int n, k; cin >> n >> k;
vector<int> v(n + 1);
map<int, int> mp;
for (int i = 1; i <= n; i ++) {
cin >> v[i];
mp[v[i]] ++;
}
vector<int> ca;
for (auto [x, y] : mp) ca.push_back(y);
sort(ca.begin(), ca.end());
int ans = ca.size();
for (auto x : ca) {
if (x > k) break;
k -= x;
ans --;
}
cout << max(1LL, ans) << endl;
}
C. Trip to the Olympiad
题意:
从 l 到 r 的区间内任选三个不同的元素,使得 ( a ⊕ b ) + ( b ⊕ c ) + ( a ⊕ c ) 的值最大 从l到r的区间内任选三个不同的元素,使得(a \oplus b) + (b \oplus c) + (a \oplus c)的值最大 从l到r的区间内任选三个不同的元素,使得(a⊕b)+(b⊕c)+(a⊕c)的值最大
思路:
首先通过打表可以发现最大值情况的三元素总会出现相邻的情况,
首先通过打表可以发现最大值情况的三元素总会出现相邻的情况,
首先通过打表可以发现最大值情况的三元素总会出现相邻的情况,
所以可以通过定位其中一个元素的方式来找到其余两个;
所以可以通过定位其中一个元素的方式来找到其余两个;
所以可以通过定位其中一个元素的方式来找到其余两个;
通过由高到低逐位比较最大最小元素的二进制前缀,找到最高的不
通过由高到低逐位比较最大最小元素的二进制前缀,找到最高的不
通过由高到低逐位比较最大最小元素的二进制前缀,找到最高的不
同位,在这之前的相同前缀无贡献;
同位,在这之前的相同前缀无贡献;
同位,在这之前的相同前缀无贡献;
所取的值要在范围内尽可能的大,所以累加无贡献但存在的位,
所取的值要在范围内尽可能的大,所以累加无贡献但存在的位,
所取的值要在范围内尽可能的大,所以累加无贡献但存在的位,
以及不同的最高位,即为定位的元素;
以及不同的最高位,即为定位的元素;
以及不同的最高位,即为定位的元素;
找到定位元素
x
取其前后即为所求,特殊的,对于定位元素
x
为边界
找到定位元素x取其前后即为所求,特殊的,对于定位元素x为边界
找到定位元素x取其前后即为所求,特殊的,对于定位元素x为边界
值
r
时,取
x
−
2
,
x
−
1
值r时,取x-2,x-1
值r时,取x−2,x−1
AC code:
void solve() {
int l, r; cin >> l >> r;
int sum = 0, pos = 30;
while (pos --) {
int now = (1LL << pos);
if ((l & now) != (r & now)) break;
if ((l & now)) sum += now;
}
int cnt = (1LL << pos) + sum;
if (r == cnt) cout << cnt - 2 << ' ' << cnt - 1 << ' ' << cnt << endl;
else cout << cnt - 1 << ' ' << cnt << ' ' << cnt + 1 << endl;
}