Codeforces Round #590 (Div. 3)

Codeforces Round #590 (Div. 3)

Posted by hongzhiyin on November 11, 2019

Codeforces Round #590 (Div. 3)

A. Equalize Prices Again

代码

1
2
3
4
5
6
7
8
9
10
int Solve() {
    int n; scanf("%d", &n);
    int sum = 0, x;
    rep(i, 0, n) {
        scanf("%d", &x);
        sum += x;
    }
    int ans = sum / n + (sum % n != 0);
    return printf("%d\n", ans);
}

B. Social Network

代码

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
const int N = 2e5+7;
 
// ------- 变量 ------- //
 
int n, k, a[N];
set <int> S;
 
// ------- 函数 ------- //
 
void Init() {
    scanf("%d%d", &n, &k);
    S.clear();
    rep(i, 0, n) scanf("%d", a+i);
}
 
int Solve() {
    deque <int> Q;
    rep(i, 0, n) {
        if (S.count(a[i])) continue;
        if (sz(Q) == k) {
            S.erase(Q.back());
            Q.pop_back();
        }
        Q.push_front(a[i]);
        S.insert(a[i]);
    }
    printf("%d\n", sz(Q));
    rep(i, 0, sz(Q)) printf("%d%c", Q[i], " \n"[i==sz(Q)-1]);
    return 0;
}

C. Pipes

代码

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
const int N = 2e5+7;
 
// ------- 变量 ------- //
 
int n;
char s[3][N];
int dp[3][N][3];
 
// ------- 函数 ------- //
 
void Init() {
    scanf("%d", &n);
    rep(i, 1, 3) scanf("%s", s[i] + 1);
}
 
int Solve() {
    dp[1][1][1] = 1;
    rep(j, 1, n+2) {
        rep(i, 1, 3) {
            if (i == 1) dp[i][j][2] = (dp[i+1][j][1] && s[i+1][j] - '0' > 2);
            if (i == 2) dp[i][j][0] = (dp[i-1][j][1] && s[i-1][j] - '0' > 2);
        }
        rep(i, 1, 3) {
            int x = s[i][j] - '0';
            if (i == 1) dp[i][j+1][1] = (dp[i][j][1] && x < 3 || dp[i][j][2] && x > 2);
            if (i == 2) dp[i][j+1][1] = (dp[i][j][1] && x < 3 || dp[i][j][0] && x > 2);
        }
    }
    return puts(dp[2][n+1][1] ? "YES" : "NO");
}

D. Distinct Characters Queries

代码

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const int N = 1e5+7;
 
// ------- 变量 ------- //
 
char s[N];
 
// ------- 函数 ------- //
 
#define ls rt << 1
#define rs rt << 1 | 1
#define lson l, m, ls
#define rson m + 1, r, rs
int sz[N<<2], t[N<<2][26];
inline ll op(ll a, ll b) { return a + b; } // ?
inline void Add(int rt, char ch) {
    rep(i, 0, 26) t[rt][i] = 0;
    t[rt][ch-'a'] = 1;
}
inline void build(int l, int r, int rt) {
    sz[rt] = r - l + 1;
    if (l == r) { rep(i, 0, 26) t[rt][i] = 0; t[rt][s[l]-'a'] = 1; return; }
    int m = (l + r) >> 1;
    build(lson); build(rson);
    rep(i, 0, 26) t[rt][i] = t[ls][i] | t[rs][i];
}
inline void upd(int pos, char ch, int l, int r, int rt) {
    if (l == r) { Add(rt, ch); return ; }
    int m = (l + r) >> 1;
    if (pos <= m) upd(pos, ch, lson);
    if (m < pos) upd(pos, ch, rson);
    rep(i, 0, 26) t[rt][i] = t[ls][i] | t[rs][i];
}
inline int qry(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) {
        int res = 0;
        rep(i, 0, 26) res |= t[rt][i] << i;
        return res;
    }
    int m = (l + r) >> 1;
    int res = 0;
    if (L <= m) res |= qry(L, R, lson);
    if (m < R) res |= qry(L, R, rson);
    return res;
}
 
void Init() {
    scanf("%s", s + 1);
}
 
int Solve() {
    int n = strlen(s + 1);
    build(1, n, 1);
    int q; scanf("%d", &q);
    while (q--) {
        int op; scanf("%d", &op);
        if (op == 1) {
            int pos; char c[5];
            scanf("%d%s", &pos, c);
            upd(pos, c[0], 1, n, 1);
        } else {
            int l, r; scanf("%d%d", &l, &r);
            int ans = qry(l, r, 1, n, 1);
            printf("%d\n", __builtin_popcount(ans));
        }
    }
    return 0;
}

E. Special Permutations

线段树

代码

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const int N = 2e5+7;
 
// ------- 变量 ------- //
 
int n, m, a[N], ans[N];
 
// ------- 函数 ------- //
 
#define ls rt << 1
#define rs rt << 1 | 1
#define lson l, m, ls
#define rson m + 1, r, rs
int sz[N<<2]; ll lazy[N<<2], t[N<<2];
inline void Add(int rt, ll val) {
    lazy[rt] += val;
    t[rt] += val * sz[rt];
}
inline void PushDown(int rt) {
    if (lazy[rt]) {
        Add(ls, lazy[rt]);
        Add(rs, lazy[rt]);
        lazy[rt] = 0;
    }
}
inline void build(int l, int r, int rt) {
    lazy[rt] = 0; sz[rt] = r - l + 1;
    if (l == r) { t[rt] = 0; return; }
    int m = (l + r) >> 1;
    build(lson); build(rson);
    t[rt] = t[ls] + t[rs];
}
inline void upd(int L, int R, ll val, int l, int r, int rt) {
    if (L > R) return ;
    if (L <= l && r <= R) { Add(rt, val); return ; }
    PushDown(rt);
    int m = (l + r) >> 1;
    if (L <= m) upd(L, R, val, lson);
    if (m < R) upd(L, R, val, rson);
    t[rt] = t[ls] + t[rs];
}
inline ll qry(int pos, int l, int r, int rt) {
    if (l == r) return t[rt];
    PushDown(rt);
    int m = (l + r) >> 1;
    ll res = 0;
    if (pos <= m) res = res + qry(pos, lson);
    if (m < pos) res = res + qry(pos, rson);
    return res;
}
 
void Init() {
    scanf("%d%d", &n, &m);
    rep(i, 1, m+1) scanf("%d", a+i);
}
 
int Solve() {
    build(1, n, 1);
    rep(i, 1, m) {
        int l = a[i], r = a[i+1];
        if (l == r) continue;
        if (l > r) swap(l, r);
        upd(1, l-1, r - l, 1, n, 1);
        upd(r+1, n, r - l, 1, n, 1);
        upd(l+1, r-1, r - l - 1, 1, n, 1);
        upd(l, l, r - 1, 1, n, 1);
        upd(r, r, l, 1, n, 1);
    }
    rep(i, 1, n+1) printf("%lld%c", qry(i, 1, n, 1), " \n"[i==n]);
    return 0;
}

F. Yet Another Substring Reverse

dp 高维前缀和

代码

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
const int N = 1e6+7;
 
// ------- 变量 ------- //
 
char s[N];
int dp[N<<1];
 
// ------- 函数 ------- //
 
void Init() {
    scanf("%s", s + 1);
    memset(dp, 0, sizeof(dp));
}
 
int Solve() {
    int len = strlen(s + 1);
    rep(i, 1, len+1) s[i] -= 'a';
    rep(i, 1, len+1) {
        int mask = 0;
        rep(j, 0, 20) {
            if (i + j > len) break;
            if (mask >> s[i+j] & 1) break;
            mask ^= 1 << s[i+j];
            dp[mask] = j + 1;
        }
    }
    rep(i, 0, 20) rep(mask, 1, 1 << 20) if (mask >> i & 1)
        dp[mask] = max(dp[mask], dp[mask ^ 1 << i]); 
    int ans = 0;
    rep(i, 1, 1 << 20) ans = max(ans, dp[i] + dp[((1 << 20) - 1) ^ i]);
    return printf("%d\n", ans);
}