• Codeforces Round #673 (Div. 2)


    A

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
     
    template<class T1, class T2> bool umin(T1& a, T2 b) { return a > b ? (a = b, true) : false; }
    template<class T1, class T2> bool umax(T1& a, T2 b) { return a < b ? (a = b, true) : false; }
    template<class T> void clear(T& a) { T().swap(a); }
     
    const int N = 1e5 + 5;
     
    int n, m, _, k;
    int a[N];
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n >> k;
            rep (i, 1, n) cin >> a[i];
            sort(a + 1, a + 1 + n);
            ll ans = 0;
            if (a[1] <= k) rep (i, 2, n) if (k >= a[i]) ans += (k - a[i]) / a[1];
            cout << ans << '
    ';
        }
        return 0;
    }
    

    B

    除非是 a + a = T, 其他的成对分开就行, 对于这个 a, 对半分开

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
     
    template<class T1, class T2> bool umin(T1& a, T2 b) { return a > b ? (a = b, true) : false; }
    template<class T1, class T2> bool umax(T1& a, T2 b) { return a < b ? (a = b, true) : false; }
    template<class T> void clear(T& a) { T().swap(a); }
     
    const int N = 1e5 + 5;
     
    int n, m, _, k;
    int b[N];
    bool v[N];
    ll a[N];
     
    bool cmp(int x, int y) {
        return a[x] < a[y];
    }
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            ll k; cin >> n >> k;
            bool f = 0;
            rep (i, 1, n) cin >> a[i], b[i] = i;
            sort(b + 1, b + 1 + n, cmp);
            unordered_set<ll> st;
            rep (i, 1, n) {
                if (a[b[i]] > k) a[b[i]] = 0;
                else if ((a[b[i]] << 1) == k && f) v[b[i]] = 1, f = 0;
                else if ((a[b[i]] << 1) == k) v[b[i]] = 0, f = 1;
                else if (!st.count(k - a[b[i]])) v[b[i]] = 0, st.insert(a[b[i]]);
                else v[b[i]] = 1;
            }
            rep (i, 1, n) cout << v[i] << ' ';
            cout << '
    ';
        }
        return 0;
    }
    

    C

    遍历 O(n)

    对每个字符x, 记录他上次出现的位置e[x], 则对于这个数字最小的区间为 c[x] = max(c[x], i - e[x])

    最后在使得 c[x] + e[x] - 1 <= n, 即覆盖到最后一个字符即可

    当然要离散化, 不然每次初始化 3e5 的 c[x] 和 e[x] 会超时

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
     
    template<class T1, class T2> bool umin(T1& a, T2 b) { return a > b ? (a = b, true) : false; }
    template<class T1, class T2> bool umax(T1& a, T2 b) { return a < b ? (a = b, true) : false; }
    template<class T> void clear(T& a) { T().swap(a); }
     
    const int N = 3e5 + 5;
     
    int n, m, _, k;
    int a[N], b[N];
    int c[N], d[N] = {1000000000}, id[N], e[N];
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n; int tot = 0; b[n + 1] = -1;
            rep (i, 1, n) cin >> a[i], b[i] = a[i], d[i] = 1e9;
            sort(b + 1, b + 1 + n);
     
            rep (i, 1, n) 
                if (b[i] != b[i + 1]) {
                    id[b[tot] = b[i]] = ++tot;
                    e[tot] = c[tot] = 0;
                }
     
            rep(i, 1, n) {
                int x = id[a[i]];
                umax(c[x], i - e[x]);
                e[x] = i;
            }
     
            rep(x, 1, tot) umax(c[x], n + 1 - e[x]), umin(d[c[x]], x);
            
            rep(i, 1, n) {
                umin(d[i], d[i - 1]);
                if (d[i] == 1e9) cout << -1 << ' ';
                else cout << b[d[i]] << ' ';
            }
            cout << '
    ';
        }
        return 0;
    }
    

    D

    3n, 对于每个数交换三次, 且第三次一定使得自己为平均数

    那么从 2~n, 先让 1 给 i 数, 使得 a[i] % i == 0, 然后把 i 全给 1

    最终所有数都到了 1, 然后让 1 给 i 平均数即可

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
    using namespace std;
    typedef unsigned long long ull;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
     
    template<class T1, class T2> bool umin(T1& a, T2 b) { return a > b ? (a = b, true) : false; }
    template<class T1, class T2> bool umax(T1& a, T2 b) { return a < b ? (a = b, true) : false; }
    template<class T> void clear(T& a) { T().swap(a); }
     
    const int N = 3e5 + 5;
     
    int n, m, _, k;
    int a[N];
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n; ll s = 0;
            rep (i, 1, n) cin >> a[i], s += a[i];
            if (s % n) { cout << "-1
    "; continue; }
            s /= n; cout << 3 * (n - 1) << '
    ';
            rep (i, 2, n) {
                cout << "1 " << i << ' ' << (a[i] % i ? i - a[i] % i : 0) << '
    ';
                cout << i << " 1 " <<  (a[i] + i - 1) / i << '
    ';
            }
            rep (i, 2, n) cout << "1 " << i << ' ' << s << '
    ';
        }
        return 0;
    }
    
  • 相关阅读:
    从1到n整数中1出现的次数
    从上往下打印二叉树
    二叉搜索树的后序遍历序列
    顺时针打印矩阵
    平衡二叉树
    反转链表
    链表中倒数第k个节点
    深入研究 Java Synchronize 和 Lock 的区别与用法
    旋转数组的最小数字
    互联网接入支付功能测试
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/13743175.html
Copyright © 2020-2023  润新知