zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    用OFC画多条曲线
    C# 写Windows服务
    asp.net遍历文件夹和文件
    Sqlserver常用函数收集之truncate table
    如何构建多用户商城
    asp.net 获取客户端IP
    Jquery从头学起第四讲
    c#相对路径和系统路径
    JQuery获取URL
    【转】 ASP.NET session 保存到数据库
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/14391647.html
Copyright © 2011-2022 走看看