大意: n个怪, m种能力值, 当自己所有能力值不低于某只怪时可以杀死它, 并获得它的所有能力, 求最大杀几只
将每只怪拆成$m$个, 排下序贪心即可, 复杂度$O(nm)$, 原题极其卡时间, 我的代码A不了, 懒得加快读了, 就这样吧
const int N = 1e6+10; int n, k; int a[N], p[N], num[N], val[6]; int u[N][6], v[N][6]; int id[6][N]; void work() { scanf("%d%d", &n, &k); REP(i,1,k) scanf("%d",val+i), p[i]=1; REP(i,1,n) num[i] = 0; REP(i,1,n) { REP(j,1,k) scanf("%d", &u[i][j]); REP(j,1,k) scanf("%d", &v[i][j]); } REP(i,1,k) { REP(j,1,n) id[i][j] = j; sort(id[i]+1,id[i]+1+n,[i](int a,int b){return u[a][i]<u[b][i];}); } int ans = 0; while (1) { int t = ans; REP(i,1,k) { while (p[i]<=n&&u[id[i][p[i]]][i]<=val[i]) { int t = id[i][p[i]]; ++p[i], ++num[t]; if (num[t]==k) { ++ans; REP(j,1,k) val[j]+=v[t][j]; } } } if (t==ans) break; } printf("%d\n", ans); REP(i,1,k) printf("%d%c", val[i], " \n"[i==k]); } int main() { int t; scanf("%d", &t); while (t--) work(); }