Codeforces: Round #713 (Div.3)

2021-04-10

Codeforces

A. Spy Detected!

You are given an array $𝑎$ consisting of $𝑛$ $(𝑛≥3)$ positive integers. It is known that in this array, all the numbers except one are the same (for example, in the array $[4,11,4,4]$ all numbers except one are equal to $4$).

Print the index of the element that does not equal others. The numbers in the array are numbered from one.

Input

The first line contains a single integer $𝑡$ $(1≤𝑡≤100)$. Then 𝑡 test cases follow.

The first line of each test case contains a single integer $𝑛$ $(3≤𝑛≤100)$ — the length of the array $𝑎$.

The second line of each test case contains $𝑛$ integers $𝑎_1,𝑎_2,…,𝑎_𝑛$ $(1≤𝑎𝑖≤100)$.

It is guaranteed that all the numbers except one in the $𝑎$ array are the same.

Output

For each test case, output a single integer — the index of the element that is not equal to others.

풀이

코드

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const char nl = '\n';

int A[101];

void solve() {
    int n; cin >> n;
    vector<int> v(n);
    memset(A, 0, sizeof(A));
    int k;
    for (int i = 0; i < n; i++) {
        cin >> v[i];
        A[v[i]]++;
    }
    for (int i = 1; i <= 100; i++) {
        if (A[i] > 1) k = i;
    }
    for (int i = 0; i < n; i++) {
        if (v[i] != k) {cout << i + 1 << nl; return; }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t; cin >> t;
    while(t--) solve();
    return 0;
}

B. Almost Rectangle

There is a square field of size $𝑛×𝑛$ in which two cells are marked. These cells can be in the same row or column.

You are to mark two more cells so that they are the corners of a rectangle with sides parallel to the coordinate axes.

For example, if $𝑛=4$ and a rectangular field looks like this (there are asterisks in the marked cells):

. . * .
. . . .
* . . .
. . . .

Then you can mark two more cells as follows

* . * .
. . . .
* . * .
. . . .

If there are several possible solutions, then print any of them.

Input

The first line contains a single integer $𝑡$ $(1≤𝑡≤400)$. Then $𝑡$ test cases follow.

The first row of each test case contains a single integer $𝑛$ $(2≤𝑛≤400)$ — the number of rows and columns in the table.

The following $𝑛$ lines each contain 𝑛 characters '.' or '*' denoting empty and marked cells, respectively.

It is guaranteed that the sums of $𝑛$ for all test cases do not exceed $400$.

It is guaranteed that there are exactly two asterisks on the field. They can be in the same row/column.

It is guaranteed that the solution exists.

Output

For each test case, output $𝑛$ rows of $𝑛$ characters — a field with four asterisks marked corresponding to the statements. If there multiple correct answers, print any of them.

풀이

코드

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const char nl = '\n';

char A[401][401];

void solve() {
    int n; cin >> n;
    vector<int> y;
    vector<int> x;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> A[i][j];
            if (A[i][j] == '*') {
                y.push_back(i);
                x.push_back(j);
            }
        }
    }
    if (y[0] == y[1]) {
        if (y[0] == n - 1) {
            A[y[0] - 1][x[0]] = '*';
            A[y[0] - 1][x[1]] = '*';
        } else {
            A[y[0] + 1][x[0]] = '*';
            A[y[0] + 1][x[1]] = '*';
        }
    } else if (x[0] == x[1]) {
        if (x[0] == n - 1) {
            A[y[0]][x[0] - 1] = '*';
            A[y[1]][x[0] - 1] = '*';
        } else {
            A[y[0]][x[0] + 1] = '*';
            A[y[1]][x[0] + 1] = '*';
        }
    } else {
        A[y[0]][x[1]] = '*';
        A[y[1]][x[0]] = '*';
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << A[i][j];
        }
        cout << nl;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t; cin >> t;
    while(t--) solve();
    return 0;
}

C. A-B Palindrome

You are given a string $𝑠$ consisting of the characters '0', '1', and '?'. You need to replace all the characters with '?' in the string 𝑠 by '0' or '1' so that the string becomes a palindrome and has exactly $𝑎$ characters '0' and exactly 𝑏 characters '1'. Note that each of the characters '?' is replaced independently from the others.

A string $𝑡$ of length $𝑛$ is called a palindrome if the equality $𝑡[𝑖]=𝑡[𝑛−𝑖+1]$ is true for all $𝑖$ $(1≤𝑖≤𝑛)$.

For example, if $𝑠=$"01?????0", $𝑎=4$ and $𝑏=4$, then you can replace the characters ‘?’ in the following ways:

  • "01011010";
  • "01100110".

For the given string $𝑠$ and the numbers $𝑎$ and $𝑏$, replace all the characters with '?' in the string $𝑠$ by '0' or '1' so that the string becomes a palindrome and has exactly $𝑎$ characters '0' and exactly $𝑏$ characters '1'.

Input

The first line contains a single integer $𝑡$ $(1≤𝑡≤10^4)$. Then $𝑡$ test cases follow.

The first line of each test case contains two integers $𝑎$ and $𝑏$ $(0≤𝑎,𝑏≤2⋅10^5, 𝑎+𝑏≥1)$.

The second line of each test case contains the string $𝑠$ of length $𝑎+𝑏$, consisting of the characters '0', '1', and '?'.

It is guaranteed that the sum of the string lengths of $𝑠$ over all test cases does not exceed $2⋅10^5$.

Output

For each test case, output:

  • "-1", if you can’t replace all the characters '?' in the string $𝑠$ by '0' or '1' so that the string becomes a palindrome and that it contains exactly 𝑎 characters '0' and exactly $𝑏$ characters '1';
  • the string that is obtained as a result of the replacement, otherwise.

If there are several suitable ways to replace characters, you can output any.

풀이

코드

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const char nl = '\n';

char A[200001];

void solve() {
    int a, b; cin >> a >> b;
    int na = 0, nb = 0;
    for (int i = 0; i < a + b; i++) cin >> A[i];
    for (int i = 0; i < a + b; i++) {
        if (A[i] == '?' && A[a + b - 1 - i] != '?') A[i] = A[a + b - 1 - i];
    }
    for (int i = 0; i < a + b; i++) {
        if (A[i] == '0') na++;
        else if (A[i] == '1') nb++;
        if (A[i] != A[a + b - 1 - i]) {
            cout << "-1\n";
            return;
        }
    }
    if ((a + b) % 2 == 1) {
        if (A[(a + b) / 2] == '?') {
            if (a % 2 == 1) { A[(a + b) / 2] = '0'; na++; }
            else { A[(a + b) / 2] = '1'; nb++; }
        }

    }
    for (int i = 0; i < a + b; i++) {
        if (A[i] == '?') {
            if (na < a) {
                A[i] = '0';
                A[a + b - 1 - i] = '0';
                na += 2;
            } else {
                A[i] = '1';
                A[a + b - 1 - i] = '1';
                nb += 2;
            }
        }
    }
    if (na != a || nb != b) cout << "-1\n";
    else {
        for (int i = 0; i < a + b; i++) {
            cout << A[i] << " \n" [i == a + b - 1];
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t; cin >> t;
    while(t--) solve();
    return 0;
}

D. Corrupted Array

You are given a number $𝑛$ and an array $𝑏_1,𝑏_2,…,𝑏_{𝑛+2}$, obtained according to the following algorithm:

  • some array $𝑎_1,𝑎_2,…,𝑎_𝑛$ was guessed;
  • array $𝑎$ was written to array $𝑏$, i.e. $𝑏𝑖=𝑎𝑖$ $(1≤𝑖≤𝑛)$;
  • The $(𝑛+1)$-th element of the array $𝑏$ is the sum of the numbers in the array $𝑎$, i.e. $𝑏_{𝑛+1}=𝑎_1+𝑎_2+…+𝑎_𝑛$;
  • The $(𝑛+2)$-th element of the array 𝑏 was written some number $𝑥$ $(1≤𝑥≤10^9)$, i.e. $𝑏_{𝑛+2}=𝑥$;
  • The array $𝑏$ was shuffled.

For example, the array $𝑏=[2,3,7,12,2]$ it could be obtained in the following ways:

  • $𝑎=[2,2,3]$ and $𝑥=12$;
  • $𝑎=[3,2,7]$ and $𝑥=2$.

For the given array $𝑏$, find any array $𝑎$ that could have been guessed initially.

Input

The first line contains a single integer $𝑡$ $(1≤𝑡≤10^4)$. Then $𝑡$ test cases follow.

The first line of each test case contains a single integer $𝑛$ $(1≤𝑛≤2⋅10^5)$.

The second row of each test case contains $𝑛+2$ integers $𝑏_1,𝑏_2,…,𝑏_{𝑛+2}$ $(1≤𝑏_𝑖≤10^9)$.

It is guaranteed that the sum of $𝑛$ over all test cases does not exceed $2⋅10^5$.

Output

For each test case, output:

  • "-1", if the array $𝑏$ could not be obtained from any array $𝑎$;
  • $𝑛$ integers $𝑎_1,𝑎_2,…,𝑎_𝑛$, otherwise.

If there are several arrays of $𝑎$, you can output any.

풀이

코드

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const char nl = '\n';

void solve() {
    int n; cin >> n;
    vector<ll> B(n + 2);
    for (int i = 0; i < n + 2; i++) cin >> B[i];
    sort(B.begin(), B.end());
    if (n == 1) {
        if( B[0] == B[1] || B[0] == B[2]) cout << B[0] << nl;
        else if (B[1] == B[2]) cout << B[1] << nl;
        else cout << "-1" << nl;
        return;
    }
    ll sum = 0;
    for (int i = 0; i < n + 1; i++) sum += B[i];
    int idx = -1;
    for (int i = 0; i < n + 1; i++) {
        if (sum - B[i] == B[n] || sum - B[i] == B[n + 1]) { idx = i; break; }
    }
    if (idx == -1) { cout << "-1" << nl; return; }
    for (int i = 0; i < n + 1; i++) {
        if (i == idx) continue;
        cout << B[i] << " ";
    }
    cout << nl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t; cin >> t;
    while(t--) solve();
    return 0;
}

https://codeforces.com/contest/1512