MnZn 求助 tle on #23 悬关
查看原帖
MnZn 求助 tle on #23 悬关
371825
SalN楼主2024/7/25 16:03
#include<bits/stdc++.h>
#define ll long long
#define up(i,l,r) for(int i=l; i<=r; ++i)
#define dn(i,r,l) for(int i=r; i>=l; --i)
 
using namespace std;
 
const int N=100005, M=1<<9, K=8;
 
int n, p, k, mx;
ll Ans=-1ll<<60, L, f[M], g[M][K];
 
struct node {
	ll a, s[K];
	bool operator<(const node &rhs) const { return a>rhs.a; }
} qwq[N];

inline int max(int a,int b) { return a>b?a:b; }
inline ll max(ll a,ll b) { return a>b?a:b; } 

signed main() {
	memset(f,-127,sizeof(f)), memset(g,-127,sizeof(g));
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> p >> k, mx=(1<<p)-1;
	up(i,1,n) cin >> qwq[i].a;
	up(i,1,n) up(j,0,p-1) cin >> qwq[i].s[j];
	sort(qwq+1,qwq+1+n); up(i,1,k) L+=qwq[i].a;
	f[0]=g[0][0]=0;
	up(i,1,k) dn(s,mx,0) up(j,0,p-1) if(s>>j&1) f[s]=max(f[s],f[s^(1<<j)]+qwq[i].s[j]-qwq[i].a);
	up(i,k+1,n) {
		dn(s,mx,0) dn(j,p,0) {
			if(j) g[s][j]=max(g[s][j],g[s][j-1]+qwq[i].a);
			up(o,0,p-1) if(s>>o&1) g[s][j]=max(g[s][j],g[s^(1<<o)][j]+qwq[i].s[o]);
		}
	}
	up(l,0,mx) {
		int cnt=0, tmp=l;
		while(tmp) ++cnt, tmp-=tmp&-tmp;
		Ans=max(Ans,L+f[l]+g[mx^l][cnt]);
	}
	cout << Ans;
	return 0;
}
2024/7/25 16:03
加载中...