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}\}) 给出0nm1的数字,排列成n×m的表格,最大化i=1nmex({ai,1,ai,2,,ai,m})+j=1mmex({a1,j,a2,j,,an,j})

思路:

取行列中最大的值 m , 0 所在的另一行 / 列为 1 ,其余均为 0 ,最大值 取行列中最大的值m,0所在的另一行/列为1,其余均为0,最大值 取行列中最大的值m0所在的另一行/列为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)的值最大 lr的区间内任选三个不同的元素,使得(ab)+(bc)+(ac)的值最大

思路:

首先通过打表可以发现最大值情况的三元素总会出现相邻的情况, 首先通过打表可以发现最大值情况的三元素总会出现相邻的情况, 首先通过打表可以发现最大值情况的三元素总会出现相邻的情况,
所以可以通过定位其中一个元素的方式来找到其余两个; 所以可以通过定位其中一个元素的方式来找到其余两个; 所以可以通过定位其中一个元素的方式来找到其余两个;

通过由高到低逐位比较最大最小元素的二进制前缀,找到最高的不 通过由高到低逐位比较最大最小元素的二进制前缀,找到最高的不 通过由高到低逐位比较最大最小元素的二进制前缀,找到最高的不
同位,在这之前的相同前缀无贡献; 同位,在这之前的相同前缀无贡献; 同位,在这之前的相同前缀无贡献;

所取的值要在范围内尽可能的大,所以累加无贡献但存在的位, 所取的值要在范围内尽可能的大,所以累加无贡献但存在的位, 所取的值要在范围内尽可能的大,所以累加无贡献但存在的位,
以及不同的最高位,即为定位的元素; 以及不同的最高位,即为定位的元素; 以及不同的最高位,即为定位的元素;

找到定位元素 x 取其前后即为所求,特殊的,对于定位元素 x 为边界 找到定位元素x取其前后即为所求,特殊的,对于定位元素x为边界 找到定位元素x取其前后即为所求,特殊的,对于定位元素x为边界
值 r 时,取 x − 2 , x − 1 值r时,取x-2,x-1 r时,取x2,x1

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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值