Educational Codeforces Round 134 (Rated for Div. 2) A~D

Educational Codeforces Round 134 (Rated for Div. 2) A~D

A - Image

#include<bits/stdc++.h>

void solve()
{
    char a[4];
    std::map<char, int> mp;
    int cnt = 0;
    for (int i = 0; i < 4; i++) {
        std::cin >> a[i];
        if (!mp[a[i]]) {cnt++; mp[a[i]] = 1;}
    }
    std::cout << cnt - 1 << "\n";
}

int main()
{
    int T;
    std::cin >> T;
    while (T--) solve();
    return 0;
}

B - Deadly Laser

#include<bits/stdc++.h>

void solve()
{
    int n, m, sx, sy, d;
    std::cin >> n >> m >> sx >> sy >> d;
    if ((sx + d >= n && sy + d >= m)) {std::cout << "-1\n"; return;}
    if ((sx - d <= 1 && sx + d >= n)) {std::cout << "-1\n"; return;}
    if ((sx - d <= 1 && sy - d <= 1)) {std::cout << "-1\n"; return;}
    if ((sy - d <= 1 && sy + d >= m)) {std::cout << "-1\n"; return;}
    std::cout << n + m - 2 << "\n";
}

int main()
{
    int T;
    std::cin >> T;
    while (T--) solve();
    return 0;
}

C - Min-Max Array Transformation

题意:给出数组a和b,满足条件 b i = a i + d i b_i = a_i + d_i bi=ai+di要求构造数组dmin和dmax,代表d数组每个元素的上下界,要求求出来b排序之后是给定的数组,a和b都是不递减的非负数组
思路:对于最小值直接找到比 a i a_i ai大的 b j b_j bj满足 d i = b j − a i d_i=b_j-a_i di=bjai。对于最大值,首先可以发现,一个数字不能构造比自己小的数组,所以我们对于一段区间要找到它能容纳的最大 b l b_l bl就行了

#include<bits/stdc++.h>

void solve()
{
    int n;
    std::cin >> n;
    std::vector<int> a(n), b(n), dmin(n), dmax(n);
    for (int i = 0; i < n; i++) std::cin >> a[i];
    for (int i = 0; i < n; i++) std::cin >> b[i];
    for (int i = 0; i < n; i++) {
        dmin[i] = std::lower_bound(b.begin(), b.end(), a[i]) - b.begin();
        dmin[i] = b[dmin[i]] - a[i];
    }
    int l = n - 1;
    for (int i = n - 1; i >= 0; i--) {
        dmax[i] = b[l] - a[i];
        if (lower_bound(b.begin(), b.end(), a[i]) - b.begin() == i) l = i - 1;
    }
    for (int i = 0; i < n; i++) std::cout << dmin[i] << " \n"[i == n - 1] ;
    for (int i = 0; i < n; i++) std::cout << dmax[i] << " \n"[i == n - 1] ;
    std::cout << "\n";
}

int main()
{
    int T;
    std::cin >> T;
    while (T--) solve();
    return 0;
}

D - Maximum AND

题意:给出数组a和b, c i = a x ⊕ b y c_i = a_x \oplus b_y ci=axby,现在要求 m a x { c 1 & c 2 & c 3 . . . & c n } max\{c_1\&c_2\&c_3...\&c_n\} max{c1&c2&c3...&cn}
思路:我们对于二进制位拆位,因为 c i = a x ⊕ b y c_i=a_x \oplus b_y ci=axby,所以假如答案是 1001010 1001010 1001010,也就代表a和b的01状态要相反,所以把b取反从高位枚举ans这一位置的情况,看a和b&上ans的情况是不是一样,一样说明这一位可以置1

#include<bits/stdc++.h>

void solve()
{
    int n;
    std::cin >> n;
    std::vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) std::cin >> a[i];
    for (int i = 0; i < n; i++) {std::cin >> b[i]; b[i] = ~b[i];}
    int ans = 0;
    for (int t = 29; t >= 0; t--) {
        ans |= (1 << t);
        std::map<int, int> mpa, mpb;
        for (int i = 0; i < n; i++) {
            mpa[a[i] & ans]++;
            mpb[b[i] & ans]++;
        }
        int f = 1;
        for (auto m : mpa) {
            if (m.second != mpb[m.first]) {f = 0; break;}
        }
        if (f) continue;
        ans ^= (1 << t);
    }
    std::cout << ans << "\n";
}

int main()
{
    int T;
    std::cin >> T;
    while (T--) solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值