Loading

AtCoder Beginner Contest 086

A - Product

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int a, b;
int main(){
    cin >> a >> b;
    if ((a * b) & 1) cout << "Odd" << endl;
    else
        cout << "Even" << endl;
    return 0;
}

B - 1 21

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int a, b;

int get(int num) {
    int res = 0;
    while (num) {
        res++;
        num /= 10;
    }
    return res;
}
int main() {
    cin >> a >> b;
    int c = a * pow(10,get(b) ) + b;
    for (int i = 1; i <= sqrt(c); i++) {
        if (i * i == c) {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
    return 0;
}

C - Traveling

一个无限大的二维网格,从原点出发,现在给出n个点,问能否在\(t_i\)秒正好到达\((x_i,y_i)\)位置

直接计算相邻两个询问的曼哈顿距离,如果距离小于时间差必然不可能达到,否则如果距离-时间为偶数那么可以到达,否则不能到达

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int n;
int main() {
    cin >> n;
    int nowx = 0, nowy = 0, nowt = 0;
    int flag = 0;
    while (n--) {
        int x, y, t;
        cin >> t >> x >> y;
        if ((abs(x - nowx) + abs(y - nowy) > (t - nowt)) ||
            (((t - nowt) - abs(x - nowx) - abs(y - nowy)) % 2 == 1)) {
            flag = 1;
        }
        nowx = x, nowy = y, nowt = t;
    }
    if (flag)
        cout << "No" << endl;
    else
        cout << "Yes" << endl;
    return 0;
}

D - Checker

给出n个点,现在要将一个无限大的二维网格进行涂色,每个白色区域占\(k*k\)个网格,黑色也是同样

现在规定了n个点的颜色,问最多能有多少个点满足条件

cba927b2484fad94fb5ff7473e9aadef.png

因为点很多,所以需要将其映射到一个较小的区间

仔细观察可以发现,如果将坐标对2k取模的话,不改变颜色,所以可以将n个点映射到\(2k*2k\)的小区间内

然后由于涂色方案不定,所以可以枚举全部的方法,将每种涂色方法看做最初的一种方法平移而来

例如:

图片.png

红框圈起来的范围可以看做一种方案,此时白色有5个区域,黑色有4个区域,如果再将其平移k个单位,黑白颜色会对调,所以不需要平移2k个距离,只需平移k次,每次分别计算白色有5个区域和白色有4个区域的情况即可

最后就是利用前缀和,直接常数时间内求出每种涂色方法的答案即可

这个题写了1个半小时...写下标写的头痛...

#include <bits/stdc++.h>

using namespace std;

const int N = 2e3 + 5;
typedef long long LL;
int n, k;
int sumw[N][N], sumb[N][N], w[N][N], b[N][N];

bool check(int num){
    if (num >= 1 && num <= 2 * k) return true;
    else
        return false;
}

int getsumw(int l1, int r1, int l2, int r2) {
    if (l2 < l1 || r2 < r1) return 0;
    if(!(check(l1)&&check(l2)&&check(r1)&&check(r2)))return 0;
    return sumw[l2][r2] - sumw[l2][r1 - 1] - sumw[l1 - 1][r2] +
           sumw[l1 - 1][r1 - 1];
}

int getsumb(int l1, int r1, int l2, int r2) {
    if (l2 < l1 || r2 < r1) return 0;
    if(!(check(l1)&&check(l2)&&check(r1)&&check(r2)))return 0;
    return sumb[l2][r2] - sumb[l2][r1 - 1] - sumb[l1 - 1][r2] +
           sumb[l1 - 1][r1 - 1];
}

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        int x, y;
        char c;
        cin >> x >> y >> c;
        if (c == 'B') {
            b[x % (2 * k) + 1][y % (2 * k) + 1]++;
        } else {
            w[x % (2 * k) + 1][y % (2 * k) + 1]++;
        }
    }
    for (int i = 1; i <= 2 * k; i++) {
        for (int j = 1; j <= 2 * k; j++) {
            sumb[i][j] =
                sumb[i - 1][j] + sumb[i][j - 1] - sumb[i - 1][j - 1] + b[i][j];
            sumw[i][j] =
                sumw[i - 1][j] + sumw[i][j - 1] - sumw[i - 1][j - 1] + w[i][j];
        }
    }
    int res = 0;
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < k; j++) {
            res = max(res,
                      getsumw(1, 1, k - i, k - j) +
                          getsumw(k + 1 - i, k + 1 - j, 2 * k - i, 2 * k - j) +
                          getsumw(1, 2 * k + 1 - j, k - i, 2 * k) +
                          getsumw(2 * k + 1 - i, 1, 2 * k, k - j) +
                          getsumw(2 * k + 1 - i, 2 * k+1 - j, 2 * k, 2 * k) +
                          getsumb(1, k+1 - j, k - i, 2 * k - j) +
                          getsumb(k + 1 - i, 1, 2 * k - i, k - j) +
                          getsumb(2 * k + 1 - i, k + 1 - j, 2 * k, 2 * k-j) +
                          getsumb(k + 1 - i, 2*k + 1- j, 2 * k-i, 2 * k));
            res = max(res,
                      getsumb(1, 1, k - i, k - j) +
                          getsumb(k + 1 - i, k + 1 - j, 2 * k - i, 2 * k - j) +
                          getsumb(1, 2 * k + 1 - j, k - i, 2 * k) +
                          getsumb(2 * k + 1 - i, 1, 2 * k, k - j) +
                          getsumb(2 * k + 1 - i, 2 * k+1 - j, 2 * k, 2 * k) +
                          getsumw(1, k+1 - j, k - i, 2 * k - j) +
                          getsumw(k + 1 - i, 1, 2 * k - i, k - j) +
                          getsumw(2 * k + 1 - i, k + 1 - j, 2 * k, 2 * k-j) +
                          getsumw(k + 1 - i, 2*k + 1- j, 2 * k-i, 2 * k));
        }
    }
    cout << res << endl;
    return 0;
}
posted @ 2021-02-09 00:51  dyhaohaoxuexi  阅读(48)  评论(0编辑  收藏  举报