Submission #433915

#TimeUsernameProblemLanguageResultExecution timeMemory
433915rqi조교 (CEOI16_popeala)C++14
100 / 100
980 ms11616 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
typedef vector<ll> vl;

#define mp make_pair
#define f first
#define s second
#define pb push_back
#define bk back()

#define sz(x) (int)(x).size()

void ckmax(int& a, int b){
	a = max(a, b);
}

void ckmin(ll& a, ll b){
	a = min(a, b);
}

void ckmin(pair<ll, int>& a, pair<ll, int> b){
	a = min(a, b);
}

const ll INF = 1e18;

int N, T, S;

int points[20005];
ll point_sum[20005];
bool solved[55][20005];
ll dp[20005];
ll ndp[20005];
ll min_dp[20005][55];
ll ans[55];

int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin >> N >> T >> S;
	for(int i = 1; i <= T; i++){
		cin >> points[i];
	}
	for(int i = 1; i <= N; i++){
		string s;
		cin >> s;
		for(int j = 1; j <= T; j++){
			if(s[j-1] == '1'){
				solved[i][j] = 1;
			}
		}
	}

	for(int j = 1; j <= T; j++){
		solved[0][j] = 1;
	}

	for(int i = 1; i <= T; i++){
		point_sum[i] = point_sum[i-1]+points[i];
	}

	for(int i = 0; i <= T; i++){
		dp[i] = INF;
	}
	dp[0] = 0;


	for(int cur_s = 0; cur_s <= S-1; cur_s++){
		// cout << "cur_s: " << cur_s << "\n";
		for(int i = 0; i <= T; i++){
			ndp[i] = INF;
		}
		for(int i = 0; i <= T; i++){
			for(int j = 0; j <= N; j++){
				min_dp[i][j] = dp[i]-ll(j)*point_sum[i];
				if(i-1 >= 0){
					ckmin(min_dp[i][j], min_dp[i-1][j]);
				}
			}
		}

		vector<pair<pi, int>> bars; //[begin, end], student
		bars.pb(mp(mp(-1, -1), 0)); //careful of transitions including this
		for(int i = 1; i <= N; i++){
			bars.pb(mp(mp(0, -1), i));
		}

		for(int i = 0; i <= T; i++){ //calculate dp[i]
			for(int j = 0; j < sz(bars); j++){
				if(bars[j].f.s >= 0){
					ckmin(ndp[i], min_dp[bars[j].f.s][j]+ll(j)*point_sum[i]);
				}
			}

			// cout << i << " " << ndp[i] << "\n";

			if(i+1 <= T){
				bars.bk.f.s++;
				vector<pair<pi, int>> new_bars;
				vector<pair<pi, int>> to_add;
				for(int bar_ind = 0; bar_ind < sz(bars); bar_ind++){
					int student = bars[bar_ind].s;
					if(solved[student][i+1]){
						new_bars.pb(bars[bar_ind]);
					}
					else{
						new_bars.bk.f.s = bars[bar_ind].f.s;
						to_add.pb(mp(mp(i+1, i), bars[bar_ind].s));
					}
				}
				for(const auto& u: to_add){
					new_bars.pb(u);
				}
				swap(bars, new_bars);
			}
			
		}

		for(int i = 0; i <= T; i++){
			swap(ndp[i], dp[i]);
		}

		ans[cur_s+1] = dp[T];
	}

	//switch for loop order

	for(int j = 1; j <= S; j++){
		cout << ans[j] << "\n";
	}

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...