Bootstrap

Codeforces Round 956 (Div. 2) 部分题解A~C

A. Array Divisibility

题目大意

构造长度为n的数组,满足:

  • 所有j的aj之和可以被k整除,其中j是k的倍数,k的取值为1~n。

思路

构造序列1->n即可满足条件。

代码实现
void solve() {
    ll n; cin >> n;
    for (int i = 1; i <= n; i++)cout << i << " ";
    cout << "\n";
}

B. Corner Twist

题目大意

给定a和b两个网格,网格中只存在0、1、2三种值。

给定操作,可以选择一个矩形的一条对角线上的两个端点,让他们加1/2;另一条对角线的端点值加2/1,然后对这些值取模3。问是否存在操作可以让a和b两个网格一致。

思路

考虑网格的边上的值,边上的值的变化会受到其他的影响,所以我们优先去找如何让边上的值相等即可。

正扫一遍,反扫一遍,然后比较数组即可。

代码实现
void solve() {
    ll n, m; cin >> n >> m;
    vector<vector<char>>a(n + 1, vector<char>(m + 1));
    vector<vector<char>>b(n + 1, vector<char>(m + 1));
    for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> a[i][j];
    for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> b[i][j];
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < m; j++) {
            if (a[i][j] != b[i][j]) {
                if (a[i][j] == '0') {
                    if (b[i][j] == '1') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 1;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 2;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 2;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }else if(b[i][j]=='2') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 2;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 1;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 1;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }
                }
                else if (a[i][j] == '1') {
                    if (b[i][j] == '2') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 1;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 2;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 2;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }
                    else if (b[i][j] == '0') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 2;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 1;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 1;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }
                }
                else {
                    if (b[i][j] == '0') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 1;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 2;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 2;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j+1] = '1';
                    }
                    else if (b[i][j] == '1') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 2;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 1;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 1;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }
                }
            }
        }
    }
    for (int i = n; i > 1; i--) {
        for (int j = m; j > 1; j--) {
            if (a[i][j] != b[i][j]) {
                if (a[i][j] == '0') {
                    if (b[i][j] == '1') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i - 1][j - 1] += 1;
                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
 
                        a[i - 1][j] += 2;
                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
 
                        a[i][j - 1] += 2;
                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
                        if (a[i][j - 1] == '4')a[i][j - 1] = '1';
                    }
                    else if (b[i][j] == '2') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i - 1][j - 1] += 2;
                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
                        if (a[i - 1][j - 1] == '4')a[i - 1][j -1] = '1';
 
                        a[i - 1][j] += 1;
                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
 
                        a[i][j - 1] += 1;
                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
                        if (a[i][j - 1] == '4')a[i][j - 1] = '1';
                    }
                }
                else if (a[i][j] == '1') {
                    if (b[i][j] == '2') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i - 1][j - 1] += 1;
                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
 
                        a[i - 1][j] += 2;
                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
 
                        a[i][j - 1] += 2;
                        if (a[i][j - 1] == '3')a[i - 1][j] = '0';
                        if (a[i][j - 1] == '4')a[i - 1][j] = '1';
                    }
                    else if (b[i][j] == '0') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i - 1][j - 1] += 2;
                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
 
                        a[i - 1][j] += 1;
                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
 
                        a[i][j - 1] += 1;
                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
                        if (a[i][j - 1] == '4')a[i][j - 1] = '1';
                    }
                }
                else {
                    if (b[i][j] == '0') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i - 1][j - 1] += 1;
                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
 
                        a[i - 1][j] += 2;
                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
 
                        a[i][j - 1] += 2;
                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
                        if (a[i][j - 1] == '4')a[i][j-1] = '1';
                    }
                    else if (b[i][j] == '1') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i - 1][j - 1] += 2;
                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
                        if (a[i - 1][j - 1] == '4')a[i - 1][j-1] = '1';
 
                        a[i - 1][j] += 1;
                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
 
                        a[i][j - 1] += 1;
                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
                        if (a[i][j - 1] == '4')a[i][j-1] = '1';
                    }
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] != b[i][j]) {
                cout << "NO\n"; return;
            }
        }
    }
    cout << "YES\n";
}

C. Have Your Cake and Eat It Too

题目大意

三个人吃蛋糕,每个人对蛋糕不同位置有自己的估价。

问如何分配蛋糕,使三个人获得的蛋糕价值均高于蛋糕价值和的三分之一。

思路

分类讨论:三个人拿蛋糕的顺序

  • abc

  • acb

  • bac

  • bca

  • cab

  • cba

代码实现
ll a[2100000];
ll b[2100000];
ll c[2100000];
void solve() {
    ll n; cin >> n;
    ll need = 0;
    a[0] = b[0] = c[0] = 0;
    for (int i = 1; i <= n; i++)cin >> a[i], need += a[i];
    for (int i = 1; i <= n; i++)cin >> b[i];
    for (int i = 1; i <= n; i++)cin >> c[i];
    need = ceil(need / 3.0);
    for (int i = 1; i <= n; i++)a[i] += a[i - 1];
    for (int i = 1; i <= n; i++)b[i] += b[i - 1];
    for (int i = 1; i <= n; i++)c[i] += c[i - 1];
    a[n + 1] = b[n + 1] = c[n + 1] = 1e22;
    //abc
    ll id = lower_bound(a + 1, a + 1 + n, need) - a;
    ll id2 = lower_bound(b + 1, b + 1 + n, b[id] + need) - b;
    if (c[n] - c[id2] >= need) {
        cout << 1 << " " << id << " " << id + 1 << " " << id2 << " " << id2 + 1 << " " << n << "\n";
        return;
    }
    //acb
    id = lower_bound(a + 1, a + 1 + n, need) - a;
    id2 = lower_bound(c + 1, c + 1 + n, c[id] + need) - c;
    if (b[n] - b[id2] >= need) {
        cout << 1 << " " << id << " " << id2 + 1 << " " << n << " " << id + 1 << " " << id2 << "\n";
        return;
    }
    //bca
    id = lower_bound(b + 1, b + 1 + n, need) - b;
    id2 = lower_bound(c + 1, c + 1 + n, c[id] + need) - c;
    if (a[n] - a[id2] >= need) {
        cout << id2 + 1 << " " << n << " " << 1 << " " << id << " " << id + 1 << " " << id2 << "\n";
        return;
    }
    //bac
    id = lower_bound(b + 1, b + 1 + n, need) - b;
    id2 = lower_bound(a + 1, a + 1 + n, a[id] + need) - a;
    if (c[n] - c[id2] >= need) {
        cout << id + 1 << " " << id2 << " " << 1 << " " << id << " " << id2 + 1 << " " << n << "\n";
        return;
    }
    //cab
    id = lower_bound(c + 1, c + 1 + n, need) - c;
    id2 = lower_bound(a + 1, a + 1 + n, a[id] + need) - a;
    if (b[n] - b[id2] >= need) {
        cout << id + 1 << " " << id2 << " " << id2 + 1 << " " << n <<" " << 1 << " " << id << "\n";
        return;
    }
    //cba
    id = lower_bound(c + 1, c + 1 + n, need) - c;
    id2 = lower_bound(b + 1, b + 1 + n, b[id] + need) - b;
    if (a[n] - a[id2] >= need) {
        cout << id2 + 1 << " " << n << " " << id + 1 << " " << id2 << " " << 1 << " " << id << "\n";
        return;
    }
    cout << "-1\n";
}

;