Submission #134109

#TimeUsernameProblemLanguageResultExecution timeMemory
134109imeimi2000Popeala (CEOI16_popeala)C++17
100 / 100
1044 ms16632 KiB
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
typedef long long llong;

const llong inf = 1e18;
int n, t, s;
int P[20001];
llong dp[51][20001];

struct dq {
    int bt, tp;
    llong val[20001];
    int idx[20001];
    void init() {
        bt = tp = 0;
    }
    void push(int i, llong v) {
        while (bt < tp && val[tp - 1] > v) --tp;
        val[tp] = v;
        idx[tp] = i;
        ++tp;
    }
    void pop(int i) {
        if (bt < tp && idx[bt] == i) ++bt;
    }
    llong get() const {
        if (bt < tp) return val[bt];
        return inf;
    }
} D[51];
int bt[51], tp[51];

char R[51][20002];
int last[20001][51];
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> t >> s;
    for (int i = 1; i <= t; ++i) {
        cin >> P[i];
        P[i] += P[i - 1];
        dp[0][i] = inf;
    }
    for (int i = 1; i <= n; ++i) cin >> R[i] + 1;
    for (int i = 1; i <= t; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (R[j][i] == '0') last[i][j] = i;
            else last[i][j] = last[i - 1][j];
        }
        last[i][0] = i;
    }
    for (int i = 1; i <= t; ++i)
        sort(last[i], last[i] + (n + 1));
    for (int g = 1; g <= s; ++g) {
        for (int i = 0; i <= n; ++i) {
            bt[i] = tp[i] = 0;
            D[i].init();
        }
        dp[g][0] = inf;
        for (int i = 1; i <= t; ++i) {
            int p = 0;
            llong v = inf;
            for (int j = 0; j <= n; ++j) {
                int x = last[i][j];
                while (tp[j] < x) {
                    D[j].push(tp[j], dp[g - 1][tp[j]] - (llong)P[tp[j]] * j);
                    ++tp[j];
                }
                while (bt[j] < p) {
                    D[j].pop(bt[j]);
                    ++bt[j];
                }
                v = min(v, D[j].get() + (llong)P[i] * j);
                p = x;
            }
            dp[g][i] = v;
        }
    }
    for (int i = 1; i <= s; ++i) printf("%lld\n", dp[i][t]);
    return 0;
}

Compilation message (stderr)

popeala.cpp: In function 'int main()':
popeala.cpp:46:46: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     for (int i = 1; i <= n; ++i) cin >> R[i] + 1;
                                         ~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...