• Codeforces Round #578 (Div. 2)


    Codeforces Round #578 (Div. 2)

    传送门

    A. Hotelier

    暴力即可。

    Code
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 2e5 + 5;
    int n;
    char s[N];
    int res[10];
    int main() {
        ios::sync_with_stdio(false); cin.tie(0);
        cin >> n;
        cin >> s + 1;
        for(int i = 1; i <= n; i++) {
            if(s[i] == 'L') {
                for(int j = 0; j < 10; j++) {
                    if(res[j] == 0) {
                        res[j] = 1;
                        break;
                    }
                }
            } else if(s[i] == 'R') {
                for(int j = 9; j >= 0; j--) {
                    if(res[j] == 0) {
                        res[j] = 1;
                        break;
                    }
                }
            } else {
                res[s[i] - '0'] = 0;
            }
        }
        for(int i = 0; i < 10; i++) cout << res[i];
     
        return 0;
    }
    

    B. Block Adventure

    贪心。对于每个位置,如果能够转移到下一个位置,肯定是尽量拿最多的(block)到袋子里。

    Code
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 2e5 + 5;
    int t, n, m, k;
    int a[N];
    int main() {
        ios::sync_with_stdio(false); cin.tie(0);
        cin >> t;
        while(t--) {
            cin >> n >> m >> k;
            for(int i = 1; i <= n; i++) cin >> a[i];
            bool ok = true;
            for(int i = 1; i < n; i++) {
                int p = max(0, a[i + 1] - k);
                if(a[i] > p) {
                    m += a[i] - p;
                } else {
                    if(m < p - a[i]) {
                        ok = false;
                        break;
                    } else {
                        m -= p - a[i];
                    }
                }
            }
            if(ok) cout << "YES" << '
    ';
            else cout << "NO" << '
    ';
        }
        return 0;
    }
    

    C. Round Corridor

    (g=gcd(n,m)),那么内环就是每(frac{n}{g})一块,外环是每(frac{m}{g})一块。
    之后判断一下是否在同一块就行。

    Code
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 2e5 + 5;
    ll n, m;
    int q;
    ll gcd(ll a, ll b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    int main() {
        ios::sync_with_stdio(false); cin.tie(0);
        cin >> n >> m >> q;
        ll g = gcd(n, m);
        ll d1 = n / g, d2 = m / g;
        while(q--) {
            ll sx, sy, ex, ey;
            cin >> sx >> sy >> ex >> ey;
            ll b1, b2;
            if(sx == 1) {
                b1 = (sy - 1) / d1;
            } else b1 = (sy - 1) / d2;
            if(ex == 1) {
                b2 = (ey - 1) / d1;
            } else b2 = (ey - 1) / d2;
            if(b1 == b2) cout << "YES" << '
    ';
            else cout << "NO" << '
    ';
        }
        return 0;
    }
    

    D. White Lines

    考虑枚举每一个位置作为矩形的左上顶点,然后更新答案。
    这样的话就需要维护一些前缀信息,比如代码中的(sum[i][j])就表示以第(j)列为起点,(1)~(i)行中满足条件的行数。“满足条件”的意思就是如果把矩形放在((i,j))这个位置,这一行能够全被染色。
    所以直接乱枚举一下就行= =

    Code
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 2005;
    int n, k;
    char s[N][N];
    int r[N][N], c[N][N], sum[N][N], mx[N][N];
    int main() {
        ios::sync_with_stdio(false); cin.tie(0);
        cin >> n >> k;
        for(int i = 1; i <= n; i++) {
            cin >> s[i] + 1;
            for(int j = 1; j <= n; j++) {
                r[i][j] = r[i][j - 1] + (s[i][j] == 'W');
                c[j][i] = c[j][i - 1] + (s[i][j] == 'W');
            }
        }
        int ans = 0;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n - k + 1; j++) {
                sum[i][j] = sum[i - 1][j];
                if(r[i][n] == n) {
                    if(j == 1) ans++;
                } else if(r[i][j - 1] + r[i][n] - r[i][j + k - 1] == n - k) sum[i][j]++;
            }
        }
        for(int i = 1; i <= n - k + 1; i++) {
            for(int j = 1; j <= n - k + 1; j++) {
                mx[i][j] = sum[i + k - 1][j] - sum[i - 1][j];
            }
        }
        memset(sum, 0, sizeof(sum));
        for(int j = 1; j <= n; j++) {
            for(int i = 1; i <= n - k + 1; i++) {
                sum[i][j] = sum[i][j - 1];
                if(c[j][n] == n) {
                    if(i == 1) ans++;
                } else if(c[j][i - 1] + c[j][n] - c[j][i + k - 1] == n - k) sum[i][j]++;
            }
        }
        int res = 0;
        for(int i = 1; i <= n - k + 1; i++) {
            for(int j = 1; j <= n - k + 1; j++) {
                res = max(res, mx[i][j] + sum[i][j + k - 1] - sum[i][j - 1]);
            }
        }
        ans += res;
        cout << ans;
        return 0;
    }
    

    E. Compress Words

    假设我们现在已有一个答案串(res),现在后面来了个(s)串来与它拼接,容易分析(res)串中最多用到(min(len_{res},len_{s}))的长度。所以我们就取出后面这一部分来搞即可。
    可以直接上扩展(kmp),也可以就用(kmp)。直接(kmp)的话先求出(s)串的(next),然后将其与(res)串后面部分(假设为(tmp)串),匹配到了(tmp)末尾时,(s)串中与其后面匹配的最长前缀就确定了。

    Code
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 5;
    int n;
    int Next[N];
    int KMP(string &s, string &t) {
        int lens = s.length(), lent = t.length();
        Next[0] = -1;
        int j = -1;
        for(int i = 1; i < lent; i++) {
            while(j >= 0 && t[i] != t[j + 1]) j = Next[j];
            if(t[i] == t[j + 1]) j++;
            Next[i] = j;
        }
        int len = min(lent, lens);
        j = -1;
        for(int i = lens - len; i < lens; i++) {
            while(j >= 0 && (j == lent - 1 || s[i] != t[j + 1])) j = Next[j];
            if(s[i] == t[j + 1]) j++;
        }
        return j;
    }
    string s, res;
    int main() {
        ios::sync_with_stdio(false); cin.tie(0);
        cin >> n >> s;
        res = s;
        for(int i = 2; i <= n; i++) {
            cin >> s;
            int p = KMP(res, s);
            res += s.substr(p + 1);
        }
        cout << res;
        return 0;
    }
    
  • 相关阅读:
    interview ms1 N_Dorm
    interview ms1 robert move **
    LeetCode OJ-- Jump Game II **
    LeetCode OJ-- Jump Game
    LeetCode OJ-- Palindrome Partitioning II ***
    LeetCode OJ--Palindrome Partitioning **
    LeetCode OJ--Palindrome Number
    LeetCode OJ-- Linked List Cycle II **
    3dContactPointAnnotationTool开发日志(十一)
    3dContactPointAnnotationTool开发日志(十)
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/11348458.html
Copyright © 2020-2023  润新知