Featured image of post Codeforces Round #1004(Div.1)

Codeforces Round #1004(Div.1)

Div.2 B

题目大意:

数据范围:

思路:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void solve() {
    int n;
    cin >> n;
    vi a(n);
    rep(i, 0, n - 1) cin >> a[i];
    vi cnt(n + 1);
    rep(i, 0, n - 1) cnt[a[i]]++;
    int las = 0;
    rep(i, 1, n) {
        if (cnt[i] == 1) {
            cout << "No" << endl;
            return;
        }
        if (cnt[i] == 0) continue;
        if (i != n) cnt[i + 1] += cnt[i] - 2;
    }
    cout << "Yes" << endl;
    return;
}

Div.2 C

题目大意:

数据范围:

思路:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void solve() {
    ll n;
    cin >> n;
    auto check = [&](ll x) -> bool {
        while (x > 0) {
            if (x % 10 == 7) return true;
            x = x / 10;
        }
        return false;
    };
    if (check(n)) {
        cout << 0 << endl;
        return;
    }
    vl cnt(10);
    cnt[0] = 9;
    rep(i, 1, 9) { cnt[i] = cnt[i - 1] * 10 + 9; }
    rep(i, 1, 9) {
        rep(j, 0, 9) {
            ll tem = n;
            if (check(tem + cnt[j] * i)) {
                cout << i << endl;
                return;
            }
        }
    }
    return;
}

Div.1 A

题目大意:

数据范围:

思路:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int ask(int l, int r) {
    int op;
    cout << "? " << l << ' ' << r << '\n';
    cout.flush();
    cin >> op;
    return op;
}
void report(char sum) {
    cout << "! " << sum << '\n';
    cout.flush();
}
void solve() {
    int n;
    cin >> n;
    vi a(n);
    rep(i, 0, n - 1) {
        cin >> a[i];
        a[i]--;
    }
    vi cnt(n, -1);
    rep(i, 0, n - 1) { cnt[a[i]] = i; }
    int idx = -1;
    rep(i, 0, n - 1) {
        if (cnt[i] == -1) {
            idx = i;
            break;
        }
    }
    if (idx != -1) {
        int idx2 = -1;
        rep(i, 0, n - 1) {
            if (i == idx) continue;
            idx2 = i;
            break;
        }
        int op = ask(idx + 1, idx2 + 1);
        if (op == 0)
            report('A');
        else
            report('B');
        return;
    }
    int op = ask(cnt[0] + 1, cnt[n - 1] + 1);
    int op2 = ask(cnt[n - 1] + 1, cnt[0] + 1);
    if (op + op2 > n)
        report('B');
    else
        report('A');
    return;
}

Div.1 B

题目大意:

数据范围:

思路:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void solve() {
    int n;
    cin >> n;
    vl a(n);
    rep(i, 0, n - 1) cin >> a[i];
    int idx = -1;
    rep(i, 0, n - 1) {
        if (a[i] == 0) {
            idx = i;
            break;
        }
    }
    if (idx == -1) {
        cout << n << endl;
        return;
    }
    int tot = 0;
    rep(i, 0, n - 1) tot += (a[i] > 0);
    vi suf(n);
    vi vis(n + 2);
    vis[0] = 1;
    int cnt = 1;
    frep(i, n - 1, 0) {
        suf[i] = cnt;
        if (a[i] > 0 && a[i] <= n) {
            vis[a[i]] = 1;
            while (vis[cnt]) cnt++;
        }
    }
    ll mixx = INT_MAX;
    bool flag = true;
    bool flag2 = false;
    rep(i, 0, n - 1) {
        if (a[i] == 0) {
            if (flag) flag2 = true;
        } else {
            mixx = min(mixx, a[i]);
            if (mixx < suf[i]) flag = false;
        }
    }
    cout << tot + flag2 << endl;
    return;
}

Div.1 C

题目大意:

数据范围:

思路:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const ll MOD = 1e9 + 7;
ull splitmix64(ull x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
}

struct custom_hash {
    static const ull FIXED_RANDOM;

    size_t operator()(ull x) const { return splitmix64(x + FIXED_RANDOM); }
};

const ull custom_hash::FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
// 如果是 x x x^d 那么,此时异或一个 d 有三种情况
void solve() {
    int n;
    cin >> n;
    vl a(n);
    rep(i, 0, n - 1) cin >> a[i];
    umap<ll, ll, custom_hash> ma;
    ma[0] = 1;
    ll tem = 0;
    ll ans = 1;
    rep(i, 0, n - 1) {
        ll tem2 = a[i];
        ll tem3 = 2 * (ma[tem] + ma[tem ^ tem2]) % MOD;
        ma[tem] = (ma[tem] + tem3) % MOD;
        tem ^= tem2;
        ans = (ans + tem3) % MOD;
    }
    cout << ans << endl;
    return;
}

Div.1 D1

题目大意:

数据范围:

思路:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
constexpr int MOD = 1e9 + 7;
constexpr int MX = 1e5 + 1;
ll F[MX];      // 预处理阶乘
ll INV_F[MX];  // 预处理逆元
ll qpow(ll x, int n) {
    ll res = 1;
    for (; n; n >>= 1) {
        if (n % 2) res = res * x % MOD;
        x = x * x % MOD;
    }
    return res;
}
auto init = [] {
    F[0] = 1;
    for (int i = 1; i < MX; i++) F[i] = F[i - 1] * i % MOD;  // 预处理阶乘
    INV_F[MX - 1] = qpow(F[MX - 1], MOD - 2);
    for (int i = MX - 1; i; i--) {
        INV_F[i - 1] = INV_F[i] * i % MOD;
    }  // 预处理逆元
    return 0;
}();
// 计算C(n,m),即从n个数中取m个数
ll comb(int n, int m) { return m < 0 || m > n ? 0 : F[n] * INV_F[m] % MOD * INV_F[n - m] % MOD; }
void solve() {
    ll n, c, m;
    cin >> n >> c >> m;
    vl a(m);
    rep(i, 0, m - 1) cin >> a[i];
    cout << comb(c * (n - 1), m - c) << endl;
    return;
}