제출 #49281

#제출 시각아이디문제언어결과실행 시간메모리
49281Benq조교 (CEOI16_popeala)C++14
100 / 100
1303 ms14680 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;

int N,T,S, poi[20000];
ll ans[20001][51], mn[51]; 
string res[50];
int tmp[50], mnind[51];
multiset<int> cur;

ll getSum(int l, int r) {
    if (l == 0) return poi[r];
    return poi[r]-poi[l-1];
}

void solve(int x) {
    // up to i 
    
    cur.clear();
    F0R(i,N+1) {
        mn[i] = 2*MOD; // fix this?
        mnind[i] = x-2;
    }
    F0R(i,N) {
        tmp[i] = 0;
        cur.insert(tmp[i]);
    }
    
    F0R(i,T) {
        F0R(j,N) if (res[j][i] == '0') {
            cur.erase(cur.find(tmp[j]));
            tmp[j] = i+1;
            cur.insert(tmp[j]);
        }
        // 0th: 1st-1
        ans[i+1][x] = 2*MOD;
        
        int co = 0;
        for (int j: cur) {
            while (mnind[co] < j-1) {
                mnind[co] ++;
                mn[co] = min(mn[co],ans[mnind[co]][x-1]+co*getSum(mnind[co],N-1));
            }
            ans[i+1][x] = min(ans[i+1][x],mn[co]-co*getSum(i+1,N-1));
            co ++;
        }
        while (mnind[co] < i) {
            mnind[co] ++;
            //cout << "ZZ " << mnind[co] << "\n";
            mn[co] = min(mn[co],ans[mnind[co]][x-1]+co*getSum(mnind[co],N-1));
            ans[i+1][x] = min(ans[i+1][x],mn[co]-co*getSum(i+1,N-1));
        }
        // cout << "HI " << i+1 << " " << x << " " << ans[i+1][x] << " " << mnind[0] <<  "\n";
        /*for (int j: cur) cout << j << " ";
        cout << "\n";*/
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> N >> T >> S;
    F0R(i,T) {
        cin >> poi[i];
        if (i) poi[i] += poi[i-1];
    }
    F0R(i,N) cin >> res[i];
    FOR(i,1,T+1) ans[i][0] = 2*MOD;
    FOR(i,1,S+1) {
        solve(i);
        cout << ans[T][i] << "\n";
    }
} // OK

// read the question correctly (is y a vowel? what are the exact constraints?)
// look out for SPECIAL CASES (n=1?) and overflow (ll vs int?)
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...