제출 #1357145

#제출 시각아이디문제언어결과실행 시간메모리
1357145Jawad_Akbar_JJ조교 (CEOI16_popeala)C++20
0 / 100
2095 ms1092 KiB
#include <iostream>

using namespace std;
#define int long long
const int N = 1<<15;
int dp[N][50];
int num[N], sc[N];

int And(int i, int j){
	int A = (1LL<<50) - 1;
	for (; i <= j; i++)
		A &= num[i];
	return A;
}

void solve(int l, int r, int st, int en, int k){
	if (l > r or st > en)
		return;
	int m = (st + en) / 2, b = l, vl = 2e9 + 7;
	for (int i=l;i<=min(r, m-1);i++){
		int val = dp[i][k-1] + __builtin_popcountll(And(i+1, m)) * (sc[m] - sc[i]);
		if (val < vl)
			vl = val, b = i;
		// cout<<i<<' '<<m<<' '<<dp[i][k-1]<<' '<<val<<endl;
	}
	dp[m][k] = vl;
	solve(l, b, st, m-1, k);
	solve(l, b, m+1, en, k);
}

signed main(){
	int n, t, s;
	cin>>n>>t>>s;

	for (int i=1;i<=t;i++)
		cin>>sc[i], sc[i] += sc[i-1];

	for (int i=0;i<n;i++){
		string str;
		cin>>str;
		for (int j=1;j<=t;j++)
			num[j] |= (1LL<<i) * (str[j-1] == '1');
	}

	for (int i=1, A = (1LL<<50) - 1;i<=t;i++){
		A &= num[i];
		dp[i][1] = sc[i] * __builtin_popcountll(A);
	}

	for (int k=2;k<=s;k++)
		solve(k-1, t, 1, t, k);
	for (int i=1;i<=s;i++)
		cout<<dp[t][i]<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...