Submission #405812

# Submission time Handle Problem Language Result Execution time Memory
405812 2021-05-16T23:03:10 Z 534351 The short shank; Redemption (BOI21_prison) C++17
80 / 100
2000 ms 163744 KB
#include <bits/stdc++.h>

using namespace std;

template<class T, class U>
void ckmin(T &a, U b)
{
    if (a > b) a = b;
}

template<class T, class U>
void ckmax(T &a, U b)
{
    if (a < b) a = b;
}

#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
#define SZ(x) ((int) (x).size())
#define ALL(x) (x).begin(), (x).end()

const int MAXN = 2100013;
const long long LLINF = 3e18;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;

int N, D, T;
int arr[MAXN], lt[MAXN];
int fen[MAXN];
ll dp[MAXN];
int cost[MAXN], taken[MAXN];
int ans;

void update(int idx, int v)
{
    for (int e = idx + 1; e <= N; e += e & (-e))
    {
        ckmax(fen[e], v);
    }
}
int query(int idx)
{
    int res = -1;
    for (int e = idx + 1; e; e -= e & (-e))
    {
        ckmax(res, fen[e]);
    }
    return res;
}
//maintain a segment tree of (dp, best dp)

pll seg[2 * MAXN]; //store (min, argmin)
ll lazy[2 * MAXN];

void build(int w, int L, int R)
{
    if (L == R)
    {
        seg[w] = {LLINF, L};
        lazy[w] = 0;
        return;
    }
    int mid = (L + R) >> 1;
    build(w << 1, L, mid);
    build(w << 1 | 1, mid + 1, R);
    seg[w] = min(seg[w << 1], seg[w << 1 | 1]);
    lazy[w] = 0;
}
void push(int w, int L, int R)
{
    if (lazy[w] == 0) return;
    seg[w].fi += lazy[w];
    if (L != R)
    {
        lazy[w << 1] += lazy[w];
        lazy[w << 1 | 1] += lazy[w];
    }
    lazy[w] = 0;
    return;
}
void update(int w, int L, int R, int a, int b, ll v)
{
    push(w, L, R);
    if (b < L || R < a) return;
    if (a <= L && R <= b)
    {
        lazy[w] += v;
        push(w, L, R);
        return;
    }
    int mid = (L + R) >> 1;
    update(w << 1, L, mid, a, b, v);
    update(w << 1 | 1, mid + 1, R, a, b, v);
    seg[w] = min(seg[w << 1], seg[w << 1 | 1]);
}

void check(int c)
{
    // cerr << "CHECKING " << c << endl;
    //assign a penalty of c for starting a new range at c.
    //minimum # of guys rebelling.
    build(1, 0, N);
    dp[0] = 0; taken[0] = 0;
    update(1, 0, N, 0, 0, -LLINF);
    // fill(cost, cost + N + 1, 0);
    FOR(i, 0, N)
    {
        int v = lt[i];
        update(1, 0, N, 0, v, 1);
        // FOR(j, 0, v + 1)
        // {
        //     cost[j]++;
        // }
        // FOR(j, 0, i + 1)
        // {
        //     if (dp[i + 1] > dp[j] + cost[j] + c)
        //     {
        //         dp[i + 1] = dp[j] + cost[j] + c;
        //         taken[i + 1] = taken[j] + 1;
        //     }
        // }
        dp[i + 1] = seg[1].fi + c;
        taken[i + 1] = taken[seg[1].se] + 1;
        update(1, 0, N, i + 1, i + 1, -LLINF + dp[i + 1]);
        // cerr << dp[i + 1] << ' ' << taken[i + 1] << endl;
    }
    // cerr << "DP " << dp[N] << " TAKEN " << c << endl;
    return;
}

int32_t main()
{
    ios_base::sync_with_stdio(false); cin.tie(0);
    cout << fixed << setprecision(12);
    cerr << fixed << setprecision(4);
    cin >> N >> D >> T; D++;
    FOR(i, 0, N)
    {
        cin >> arr[i];
    }
    fill(fen, fen + N + 1, -1);
    FOR(i, 0, N)
    {
        int c = arr[i];
        if (c <= T)
        {
            //i...i+(T-c) are getting infected.
            update(max(0, N - 1 - (i + (T - c))), i);
        }
        lt[i] = query(N - 1 - i);
        // cerr << lt[i] << ' ';
    }
    if (D == 2)
    {
        FOR(i, 0, N)
        {
            int v = lt[i];
            // cerr << v << endl;
            //it will rebel if:
            //v != -1
            //the block is in 0...v-1 or i...N-1
            if (v != -1)
            {
                cost[0]++;
                cost[v]--;
                cost[i]++;
                cost[N]--;
            }
        }
        FOR(i, 0, N)
        {
            cost[i + 1] += cost[i];
        }
        ans = N;
        FOR(i, 0, N - 1)
        {
            ckmin(ans, cost[i]);
        }
        cout << ans << '\n';
        return 0;
    }
    int lo = 0, hi = N + 1;
    while(hi > lo)
    {
        int mid = (hi + lo + 1) >> 1;
        check(mid);
        if (taken[N] >= D) lo = mid;
        else hi = mid - 1;
    }
    // cerr << "LO = " << lo << endl;
    check(lo);
    // cerr << "TAKED " << taken[N] << endl;
    ll cost1 = dp[N] - lo * taken[N]; int cnt1 = taken[N];
    assert(cnt1 >= D);
    if (cnt1 == D)
    {
        ans = cost1;
    }
    else
    {
        hi++;
        check(hi);
        ll cost2 = dp[N] - hi * taken[N]; int cnt2 = taken[N];
        assert(cnt2 < D);
        // cerr << cost1 << ' ' << cnt1 << ' ' << cost2 << ' ' << cnt2 << endl;
        ans = cost2 + (cost1 - cost2) * (D - cnt2) / (cnt1 - cnt2);
    }
    cout << ans << '\n';
    //you are going to have some new blocks starting with -1....x. and then -1...x and then -1...x
    // cerr << endl;
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 3 ms 408 KB Output is correct
5 Correct 3 ms 332 KB Output is correct
6 Correct 4 ms 332 KB Output is correct
7 Correct 3 ms 332 KB Output is correct
8 Correct 3 ms 332 KB Output is correct
9 Correct 3 ms 332 KB Output is correct
10 Correct 3 ms 332 KB Output is correct
11 Correct 2 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 88 ms 8092 KB Output is correct
3 Correct 95 ms 12892 KB Output is correct
4 Correct 85 ms 11452 KB Output is correct
5 Correct 65 ms 10076 KB Output is correct
6 Correct 83 ms 12008 KB Output is correct
7 Correct 91 ms 11972 KB Output is correct
8 Correct 80 ms 12016 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 3 ms 408 KB Output is correct
5 Correct 3 ms 332 KB Output is correct
6 Correct 4 ms 332 KB Output is correct
7 Correct 3 ms 332 KB Output is correct
8 Correct 3 ms 332 KB Output is correct
9 Correct 3 ms 332 KB Output is correct
10 Correct 3 ms 332 KB Output is correct
11 Correct 2 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 2 ms 332 KB Output is correct
14 Correct 2 ms 332 KB Output is correct
15 Correct 3 ms 332 KB Output is correct
16 Correct 3 ms 332 KB Output is correct
17 Correct 3 ms 332 KB Output is correct
18 Correct 3 ms 332 KB Output is correct
19 Correct 3 ms 332 KB Output is correct
20 Correct 3 ms 332 KB Output is correct
21 Correct 3 ms 332 KB Output is correct
22 Correct 3 ms 332 KB Output is correct
23 Correct 29 ms 588 KB Output is correct
24 Correct 29 ms 588 KB Output is correct
25 Correct 28 ms 588 KB Output is correct
26 Correct 38 ms 644 KB Output is correct
27 Correct 28 ms 588 KB Output is correct
28 Correct 30 ms 648 KB Output is correct
29 Correct 36 ms 652 KB Output is correct
30 Correct 25 ms 660 KB Output is correct
31 Correct 29 ms 588 KB Output is correct
32 Correct 24 ms 588 KB Output is correct
33 Correct 24 ms 656 KB Output is correct
34 Correct 35 ms 588 KB Output is correct
35 Correct 26 ms 588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 922 ms 8272 KB Output is correct
3 Correct 916 ms 8332 KB Output is correct
4 Correct 876 ms 8260 KB Output is correct
5 Correct 885 ms 8276 KB Output is correct
6 Correct 996 ms 8272 KB Output is correct
7 Correct 742 ms 8272 KB Output is correct
8 Correct 764 ms 8388 KB Output is correct
9 Correct 780 ms 8388 KB Output is correct
10 Correct 865 ms 8260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 3 ms 408 KB Output is correct
5 Correct 3 ms 332 KB Output is correct
6 Correct 4 ms 332 KB Output is correct
7 Correct 3 ms 332 KB Output is correct
8 Correct 3 ms 332 KB Output is correct
9 Correct 3 ms 332 KB Output is correct
10 Correct 3 ms 332 KB Output is correct
11 Correct 2 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 2 ms 332 KB Output is correct
14 Correct 2 ms 332 KB Output is correct
15 Correct 3 ms 332 KB Output is correct
16 Correct 3 ms 332 KB Output is correct
17 Correct 3 ms 332 KB Output is correct
18 Correct 3 ms 332 KB Output is correct
19 Correct 3 ms 332 KB Output is correct
20 Correct 3 ms 332 KB Output is correct
21 Correct 3 ms 332 KB Output is correct
22 Correct 3 ms 332 KB Output is correct
23 Correct 29 ms 588 KB Output is correct
24 Correct 29 ms 588 KB Output is correct
25 Correct 28 ms 588 KB Output is correct
26 Correct 38 ms 644 KB Output is correct
27 Correct 28 ms 588 KB Output is correct
28 Correct 30 ms 648 KB Output is correct
29 Correct 36 ms 652 KB Output is correct
30 Correct 25 ms 660 KB Output is correct
31 Correct 29 ms 588 KB Output is correct
32 Correct 24 ms 588 KB Output is correct
33 Correct 24 ms 656 KB Output is correct
34 Correct 35 ms 588 KB Output is correct
35 Correct 26 ms 588 KB Output is correct
36 Correct 1 ms 332 KB Output is correct
37 Correct 922 ms 8272 KB Output is correct
38 Correct 916 ms 8332 KB Output is correct
39 Correct 876 ms 8260 KB Output is correct
40 Correct 885 ms 8276 KB Output is correct
41 Correct 996 ms 8272 KB Output is correct
42 Correct 742 ms 8272 KB Output is correct
43 Correct 764 ms 8388 KB Output is correct
44 Correct 780 ms 8388 KB Output is correct
45 Correct 865 ms 8260 KB Output is correct
46 Correct 1 ms 332 KB Output is correct
47 Correct 2 ms 332 KB Output is correct
48 Correct 2 ms 332 KB Output is correct
49 Correct 3 ms 332 KB Output is correct
50 Correct 3 ms 332 KB Output is correct
51 Correct 3 ms 332 KB Output is correct
52 Correct 3 ms 400 KB Output is correct
53 Correct 3 ms 332 KB Output is correct
54 Correct 3 ms 364 KB Output is correct
55 Correct 3 ms 332 KB Output is correct
56 Correct 3 ms 332 KB Output is correct
57 Correct 28 ms 636 KB Output is correct
58 Correct 28 ms 652 KB Output is correct
59 Correct 28 ms 588 KB Output is correct
60 Correct 29 ms 644 KB Output is correct
61 Correct 28 ms 588 KB Output is correct
62 Correct 28 ms 588 KB Output is correct
63 Correct 29 ms 656 KB Output is correct
64 Correct 25 ms 652 KB Output is correct
65 Correct 25 ms 588 KB Output is correct
66 Correct 24 ms 652 KB Output is correct
67 Correct 25 ms 656 KB Output is correct
68 Correct 26 ms 588 KB Output is correct
69 Correct 26 ms 588 KB Output is correct
70 Correct 1 ms 332 KB Output is correct
71 Correct 916 ms 8348 KB Output is correct
72 Correct 935 ms 8388 KB Output is correct
73 Correct 879 ms 8260 KB Output is correct
74 Correct 914 ms 8268 KB Output is correct
75 Correct 883 ms 8276 KB Output is correct
76 Correct 741 ms 8304 KB Output is correct
77 Correct 755 ms 8296 KB Output is correct
78 Correct 791 ms 8204 KB Output is correct
79 Correct 868 ms 8268 KB Output is correct
80 Correct 927 ms 8268 KB Output is correct
81 Correct 908 ms 8276 KB Output is correct
82 Correct 924 ms 8260 KB Output is correct
83 Correct 916 ms 8268 KB Output is correct
84 Correct 896 ms 8388 KB Output is correct
85 Correct 882 ms 8388 KB Output is correct
86 Correct 839 ms 8388 KB Output is correct
87 Correct 749 ms 8388 KB Output is correct
88 Correct 751 ms 8388 KB Output is correct
89 Correct 842 ms 8300 KB Output is correct
90 Correct 851 ms 8268 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 3 ms 408 KB Output is correct
5 Correct 3 ms 332 KB Output is correct
6 Correct 4 ms 332 KB Output is correct
7 Correct 3 ms 332 KB Output is correct
8 Correct 3 ms 332 KB Output is correct
9 Correct 3 ms 332 KB Output is correct
10 Correct 3 ms 332 KB Output is correct
11 Correct 2 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 88 ms 8092 KB Output is correct
14 Correct 95 ms 12892 KB Output is correct
15 Correct 85 ms 11452 KB Output is correct
16 Correct 65 ms 10076 KB Output is correct
17 Correct 83 ms 12008 KB Output is correct
18 Correct 91 ms 11972 KB Output is correct
19 Correct 80 ms 12016 KB Output is correct
20 Correct 1 ms 332 KB Output is correct
21 Correct 2 ms 332 KB Output is correct
22 Correct 2 ms 332 KB Output is correct
23 Correct 3 ms 332 KB Output is correct
24 Correct 3 ms 332 KB Output is correct
25 Correct 3 ms 332 KB Output is correct
26 Correct 3 ms 332 KB Output is correct
27 Correct 3 ms 332 KB Output is correct
28 Correct 3 ms 332 KB Output is correct
29 Correct 3 ms 332 KB Output is correct
30 Correct 3 ms 332 KB Output is correct
31 Correct 29 ms 588 KB Output is correct
32 Correct 29 ms 588 KB Output is correct
33 Correct 28 ms 588 KB Output is correct
34 Correct 38 ms 644 KB Output is correct
35 Correct 28 ms 588 KB Output is correct
36 Correct 30 ms 648 KB Output is correct
37 Correct 36 ms 652 KB Output is correct
38 Correct 25 ms 660 KB Output is correct
39 Correct 29 ms 588 KB Output is correct
40 Correct 24 ms 588 KB Output is correct
41 Correct 24 ms 656 KB Output is correct
42 Correct 35 ms 588 KB Output is correct
43 Correct 26 ms 588 KB Output is correct
44 Correct 1 ms 332 KB Output is correct
45 Correct 922 ms 8272 KB Output is correct
46 Correct 916 ms 8332 KB Output is correct
47 Correct 876 ms 8260 KB Output is correct
48 Correct 885 ms 8276 KB Output is correct
49 Correct 996 ms 8272 KB Output is correct
50 Correct 742 ms 8272 KB Output is correct
51 Correct 764 ms 8388 KB Output is correct
52 Correct 780 ms 8388 KB Output is correct
53 Correct 865 ms 8260 KB Output is correct
54 Correct 1 ms 332 KB Output is correct
55 Correct 2 ms 332 KB Output is correct
56 Correct 2 ms 332 KB Output is correct
57 Correct 3 ms 332 KB Output is correct
58 Correct 3 ms 332 KB Output is correct
59 Correct 3 ms 332 KB Output is correct
60 Correct 3 ms 400 KB Output is correct
61 Correct 3 ms 332 KB Output is correct
62 Correct 3 ms 364 KB Output is correct
63 Correct 3 ms 332 KB Output is correct
64 Correct 3 ms 332 KB Output is correct
65 Correct 28 ms 636 KB Output is correct
66 Correct 28 ms 652 KB Output is correct
67 Correct 28 ms 588 KB Output is correct
68 Correct 29 ms 644 KB Output is correct
69 Correct 28 ms 588 KB Output is correct
70 Correct 28 ms 588 KB Output is correct
71 Correct 29 ms 656 KB Output is correct
72 Correct 25 ms 652 KB Output is correct
73 Correct 25 ms 588 KB Output is correct
74 Correct 24 ms 652 KB Output is correct
75 Correct 25 ms 656 KB Output is correct
76 Correct 26 ms 588 KB Output is correct
77 Correct 26 ms 588 KB Output is correct
78 Correct 1 ms 332 KB Output is correct
79 Correct 916 ms 8348 KB Output is correct
80 Correct 935 ms 8388 KB Output is correct
81 Correct 879 ms 8260 KB Output is correct
82 Correct 914 ms 8268 KB Output is correct
83 Correct 883 ms 8276 KB Output is correct
84 Correct 741 ms 8304 KB Output is correct
85 Correct 755 ms 8296 KB Output is correct
86 Correct 791 ms 8204 KB Output is correct
87 Correct 868 ms 8268 KB Output is correct
88 Correct 927 ms 8268 KB Output is correct
89 Correct 908 ms 8276 KB Output is correct
90 Correct 924 ms 8260 KB Output is correct
91 Correct 916 ms 8268 KB Output is correct
92 Correct 896 ms 8388 KB Output is correct
93 Correct 882 ms 8388 KB Output is correct
94 Correct 839 ms 8388 KB Output is correct
95 Correct 749 ms 8388 KB Output is correct
96 Correct 751 ms 8388 KB Output is correct
97 Correct 842 ms 8300 KB Output is correct
98 Correct 851 ms 8268 KB Output is correct
99 Correct 1 ms 332 KB Output is correct
100 Correct 3 ms 316 KB Output is correct
101 Correct 3 ms 324 KB Output is correct
102 Correct 3 ms 332 KB Output is correct
103 Correct 3 ms 324 KB Output is correct
104 Correct 3 ms 332 KB Output is correct
105 Correct 3 ms 332 KB Output is correct
106 Correct 3 ms 332 KB Output is correct
107 Correct 3 ms 332 KB Output is correct
108 Correct 3 ms 332 KB Output is correct
109 Correct 3 ms 332 KB Output is correct
110 Correct 1 ms 332 KB Output is correct
111 Correct 92 ms 12996 KB Output is correct
112 Correct 98 ms 12940 KB Output is correct
113 Correct 81 ms 11576 KB Output is correct
114 Correct 61 ms 9928 KB Output is correct
115 Correct 73 ms 12052 KB Output is correct
116 Correct 68 ms 12076 KB Output is correct
117 Correct 73 ms 11972 KB Output is correct
118 Correct 28 ms 588 KB Output is correct
119 Correct 28 ms 584 KB Output is correct
120 Correct 30 ms 680 KB Output is correct
121 Correct 30 ms 692 KB Output is correct
122 Correct 28 ms 588 KB Output is correct
123 Correct 28 ms 588 KB Output is correct
124 Correct 28 ms 588 KB Output is correct
125 Correct 24 ms 588 KB Output is correct
126 Correct 25 ms 616 KB Output is correct
127 Correct 24 ms 676 KB Output is correct
128 Correct 24 ms 588 KB Output is correct
129 Correct 26 ms 588 KB Output is correct
130 Correct 26 ms 588 KB Output is correct
131 Correct 1 ms 332 KB Output is correct
132 Correct 920 ms 9080 KB Output is correct
133 Correct 920 ms 8900 KB Output is correct
134 Correct 883 ms 8724 KB Output is correct
135 Correct 880 ms 8940 KB Output is correct
136 Correct 896 ms 9012 KB Output is correct
137 Correct 745 ms 8792 KB Output is correct
138 Correct 758 ms 8788 KB Output is correct
139 Correct 773 ms 8756 KB Output is correct
140 Correct 849 ms 8788 KB Output is correct
141 Correct 912 ms 8900 KB Output is correct
142 Correct 958 ms 9004 KB Output is correct
143 Correct 912 ms 8940 KB Output is correct
144 Correct 911 ms 8704 KB Output is correct
145 Correct 881 ms 8388 KB Output is correct
146 Correct 885 ms 9036 KB Output is correct
147 Correct 831 ms 8772 KB Output is correct
148 Correct 742 ms 8900 KB Output is correct
149 Correct 759 ms 8796 KB Output is correct
150 Correct 854 ms 8900 KB Output is correct
151 Correct 852 ms 8900 KB Output is correct
152 Execution timed out 2028 ms 163744 KB Time limit exceeded
153 Halted 0 ms 0 KB -