zoukankan      html  css  js  c++  java
  • Codeforces Global Round 7

    A. Bad Ugly Numbers

    题意:构造一个 $n$ 位数 $s$ 使其满足:$s$ 为正数,每一位不等于零,$s$ 不被每一位整除。

    思路:就构造就行了,也没啥可说的。

    #include <bits/stdc++.h>
    #define pb(x) push_back(x)
    #define mp(x, y) make_pair(x, y)
    #define fast ios::sync_with_stdio(false)
    #define mset(a, n) memset(a, n, sizeof(a))
    #define forn(i, n) for (int i = 0; i < (n); ++i)
    #define forab(i, a, b) for (int i = (a); i <= (b); ++i)
    #define forba(i, b, a) for (int i = (b); i >= (a); --i)
    #define db double
    #define ll long long
    #define endl '
    '
    #define fi first
    #define se second
     
    using namespace std;
     
    typedef pair<int, int> P;
     
    inline int lowbit(int x) { return x & (-x); }
     
    int main(){
        fast;
        int t;
        cin >> t;
        while (t--) {
            int n;
            cin >> n;
            if (n == 1){
                cout << "-1
    ";
            } else {
                cout << "8";
                forn(i, n - 1){
                    cout << "9";
                }
                cout << "
    ";
            }
        }
        return 0;
    }
    View Code

    B. Maximums

    题意:现有一个长度为 $n$ 的数列 $a$ ,定义数列 $x_{i} = max(0, a_{1}...a_{i-1})$,当 $i = 1$时,$x_{1} = 0$,另定义数列 $b_{i} = a_{i} - x_{i}$。目前给定数列 $b$,求数列 $a$。

    思路:维护当前最大值向后遍历就行了。

    #include <bits/stdc++.h>
    #define pb(x) push_back(x)
    #define mp(x, y) make_pair(x, y)
    #define fast ios::sync_with_stdio(false)
    #define mset(a, n) memset(a, n, sizeof(a))
    #define forn(i, n) for (int i = 0; i < (n); ++i)
    #define forab(i, a, b) for (int i = (a); i <= (b); ++i)
    #define forba(i, b, a) for (int i = (b); i >= (a); --i)
    #define db double
    #define ll long long
    #define endl '
    '
    #define fi first
    #define se second
     
    using namespace std;
     
    typedef pair<int, int> P;
     
    inline int lowbit(int x) { return x & (-x); }
     
    const int N = 2e5 + 5;
    ll b[N], ans[N], n;
     
    int main(){
        fast;
        cin >> n;
        forab(i, 1, n){
            cin >> b[i];
        }
        ll maxx = -0x3f3f3f3f;
        ans[1] = b[1];
        maxx = max(ans[1], maxx);
        forab(i, 2, n){
            ans[i] = b[i] + maxx;
            maxx = max(maxx, ans[i]);
        }
        forab(i, 1, n){
            cout << ans[i];
            if (i != n)
                cout << " ";
        }
        cout << "
    ";
        return 0;
    }
    View Code

    C. Permutation Partitions

    题意:感觉题目稍微有点绕,给定一个 $1-n$ 上的全排列,将这个全排列分成不相交的 $k$ 段,定义该划分的 $value$ 为各段最大值的和,求该全排列所有可能划分中 $value$ 的最大值和达到最大值的划分情况个数。

    思路:读懂题目之后思路其实就出来了,$1-n$ 的全排列分成 $k$ 段,显然最大的 $value$ 为前 $k$ 大的数之和,至于满足情况的个数,从小到大记录前 $k$ 个数出现的位置,每次将答案乘以相邻两数位置之差就是答案,这题两发才过,第一发我模数写错了真是***了。

    #include <bits/stdc++.h>
    #define pb(x) push_back(x)
    #define mp(x, y) make_pair(x, y)
    #define fast ios::sync_with_stdio(false)
    #define mset(a, n) memset(a, n, sizeof(a))
    #define forn(i, n) for (int i = 0; i < (n); ++i)
    #define forab(i, a, b) for (int i = (a); i <= (b); ++i)
    #define forba(i, b, a) for (int i = (b); i >= (a); --i)
    #define db double
    #define ll long long
    #define endl '
    '
    #define fi first
    #define se second
     
    using namespace std;
     
    typedef pair<int, int> P;
     
    inline int lowbit(int x) { return x & (-x); }
     
    const ll MOD = 1e9 + 7;
    const ll mod = 998244353;
     
    vector<ll> v;
     
    int main(){
        fast;
        ll n, k;
        cin >> n >> k;
        ll ans = 0, cnt = 1;
        forab(i, 1, n){
            int x;
            cin >> x;
            if (x > (n - k)){
                v.push_back(i);
                ans += x;
            }
        }
        for (int i = 0; i < v.size() - 1; ++i) {
            cnt = cnt * (v[i + 1] - v[i]) % mod;
        }
        cout << ans << " " << cnt << "
    ";
        return 0;
    }
    View Code

    D1. Prefix-Suffix Palindrome (Easy version)

    题意:给定字符串 $s$,要求构造字符串 $t$ 满足:$t$ 的长度不大于 $s$且为回文串,并且由 $s$ 的一个前缀和一个后缀(可以为空串)加和构成。

    思路:首先求出 $s$ 中前后缀相等部分,之后对于剩余子串求最长回文子串即可(Manacher即可,顺便更新了一下模板)。

    #include <bits/stdc++.h>
    #define pb(x) push_back(x)
    #define mp(x, y) make_pair(x, y)
    #define fast ios::sync_with_stdio(false)
    #define mset(a, n) memset(a, n, sizeof(a))
    #define forn(i, n) for (int i = 0; i < (n); ++i)
    #define forab(i, a, b) for (int i = (a); i <= (b); ++i)
    #define forba(i, b, a) for (int i = (b); i >= (a); --i)
    #define db double
    #define ll long long
    #define endl '
    '
    #define fi first
    #define se second
     
    using namespace std;
     
    typedef pair<int, int> P;
     
    inline int lowbit(int x) { return x & (-x); }
     
    const ll MOD = 1e9 + 7;
    const ll mod = 998244353;
     
    string Manacher(string &s) {
        string t = "$#";
        for (int i = 0; i < s.length(); ++i) {
            t += s[i];
            t += '#';
        }
     
        int ml = 0, p = 0, R = 0, M = 0;
     
        int len = t.length();
        vector<int> P(len, 0);
        for (int i = 0; i < len; ++i) {
            P[i] = R > i ? min(P[2 * M - i], R - i) : 1;
            while (t[i + P[i]] == t[i - P[i]]) ++P[i];
            if (i + P[i] > R) {
                R = i + P[i];
                M = i;
            }
            if (ml < P[i] && (i - P[i]) / 2 == 0) {
                ml = P[i];
                p = i;
            }
        }
     
        return s.substr((p - ml) / 2, ml - 1);
    }
     
    int main(){
        fast;
        int t;
        cin >> t;
        while (t--) {
            string s;
            cin >> s;
            int l = 0, r = s.size() - 1;
            while (s[l] == s[r] && l < r)
                ++l, --r;
            string pre = s.substr(0, l), suf = s.substr(r + 1);
            //cout << pre << " " << suf << "
    ";
            string ss = s.substr(l, r - l + 1);
            string ex = Manacher(ss);
            reverse(ss.begin(), ss.end());
            string exx = Manacher(ss);
            //cout << ss << " " << ex << " " << exx << "
    ";
            if (ex.length() > exx.length())
                cout << pre + ex + suf << "
    ";
            else
                cout << pre + exx + suf << "
    ";
        }
     
        return 0;
    }
    View Code

    D2. Prefix-Suffix Palindrome (Hard version)

    思路同上,一样的代码即可。

  • 相关阅读:
    520 简单表白代码(JS)
    2017总结+展望2018
    JavaScript中标识符的命名
    ubuntu16.04 CUDA, CUDNN 安装
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Codeforces Round #489 (Div. 2) E. Nastya and King-Shamans
    AtCoder Regular Contest 098 F.Donation
    hackerrank Project Euler #210: Obtuse Angled Triangles
    论文阅读 | CrystalBall: A Visual Analytic System for Future Event Discovery and Analysis from Social Media Data
    python学习笔记5
  • 原文地址:https://www.cnblogs.com/zssst/p/12530631.html
Copyright © 2011-2022 走看看