主代码请空降至422行
题意:
略;
思路:
k不大,建立k+1个数组,分别按照每个魔法属性排序,设置相应的指针,表示小于 当前猎人拥有的对应魔法属性的 位置,分别跑On,记录并处理;
比上一个写法好多了;
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#include <cmath>
using namespace std;
const int maxn = 1e5 + 7;
namespace fastIO {
#define BUF_SIZE 100000
#define OUT_SIZE 100000
#define ll long long
//fread->read
bool IOerror=0;
inline char nc() {
static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
if (p1==pend) {
p1=buf;
pend=buf+fread(buf,1,BUF_SIZE,stdin);
if (pend==p1) {
IOerror=1;
return -1;
}
//{printf("IO error!\n");system("pause");for (;;);exit(0);}
}
return *p1++;
}
inline bool blank(char ch) {
return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';
}
inline void read(int &x) {
bool sign=0;
char ch=nc();
x=0;
for (; blank(ch); ch=nc());
if (IOerror)
return;
if (ch=='-')
sign=1,ch=nc();
for (; ch>='0'&&ch<='9'; ch=nc())
x=x*10+ch-'0';
if (sign)
x=-x;
}
inline void read(ll &x) {
bool sign=0;
char ch=nc();
x=0;
for (; blank(ch); ch=nc());
if (IOerror)
return;
if (ch=='-')
sign=1,ch=nc();
for (; ch>='0'&&ch<='9'; ch=nc())
x=x*10+ch-'0';
if (sign)
x=-x;
}
inline void read(double &x) {
bool sign=0;
char ch=nc();
x=0;
for (; blank(ch); ch=nc());
if (IOerror)
return;
if (ch=='-')
sign=1,ch=nc();
for (; ch>='0'&&ch<='9'; ch=nc())
x=x*10+ch-'0';
if (ch=='.') {
double tmp=1;
ch=nc();
for (; ch>='0'&&ch<='9'; ch=nc())
tmp/=10.0,x+=tmp*(ch-'0');
}
if (sign)
x=-x;
}
inline void read(char *s) {
char ch=nc();
for (; blank(ch); ch=nc());
if (IOerror)
return;
for (; !blank(ch)&&!IOerror; ch=nc())
*s++=ch;
*s=0;
}
inline void read(char &c) {
for (c=nc(); blank(c); c=nc());
if (IOerror) {
c=-1;
return;
}
}
//getchar->read
inline void read1(int &x) {
char ch;
int bo=0;
x=0;
for (ch=getchar(); ch<'0'||ch>'9'; ch=getchar())
if (ch=='-')
bo=1;
for (; ch>='0'&&ch<='9'; x=x*10+ch-'0',ch=getchar());
if (bo)
x=-x;
}
inline void read1(ll &x) {
char ch;
int bo=0;
x=0;
for (ch=getchar(); ch<'0'||ch>'9'; ch=getchar())
if (ch=='-')
bo=1;
for (; ch>='0'&&ch<='9'; x=x*10+ch-'0',ch=getchar());
if (bo)
x=-x;
}
inline void read1(double &x) {
char ch;
int bo=0;
x=0;
for (ch=getchar(); ch<'0'||ch>'9'; ch=getchar())
if (ch=='-')
bo=1;
for (; ch>='0'&&ch<='9'; x=x*10+ch-'0',ch=getchar());
if (ch=='.') {
double tmp=1;
for (ch=getchar(); ch>='0'&&ch<='9'; tmp/=10.0,x+=tmp*(ch-'0'),ch=getchar());
}
if (bo)
x=-x;
}
inline void read1(char *s) {
char ch=getchar();
for (; blank(ch); ch=getchar());
for (; !blank(ch); ch=getchar())
*s++=ch;
*s=0;
}
inline void read1(char &c) {
for (c=getchar(); blank(c); c=getchar())
;
}
//scanf->read
inline void read2(int &x) {
scanf("%d",&x);
}
inline void read2(ll &x) {
#ifdef _WIN32
scanf("%I64d",&x);
#else
#ifdef __linux
scanf("%lld",&x);
#else
puts("error:can't recognize the system!");
#endif
#endif
}
inline void read2(double &x) {
scanf("%lf",&x);
}
inline void read2(char *s) {
scanf("%s",s);
}
inline void read2(char &c) {
scanf(" %c",&c);
}
inline void readln2(char *s) {
gets(s);
}
//fwrite->write
struct Ostream_fwrite {
char *buf,*p1,*pend;
Ostream_fwrite() {
buf=new char[BUF_SIZE];
p1=buf;
pend=buf+BUF_SIZE;
}
void out(char ch) {
if (p1==pend) {
fwrite(buf,1,BUF_SIZE,stdout);
p1=buf;
}
*p1++=ch;
}
void print(int x) {
static char s[15],*s1;
s1=s;
if (!x)
*s1++='0';
if (x<0)
out('-'),x=-x;
while(x)
*s1++=x%10+'0',x/=10;
while(s1--!=s)
out(*s1);
}
void println(int x) {
static char s[15],*s1;
s1=s;
if (!x)
*s1++='0';
if (x<0)
out('-'),x=-x;
while(x)
*s1++=x%10+'0',x/=10;
while(s1--!=s)
out(*s1);
out('\n');
}
void print(ll x) {
static char s[25],*s1;
s1=s;
if (!x)
*s1++='0';
if (x<0)
out('-'),x=-x;
while(x)
*s1++=x%10+'0',x/=10;
while(s1--!=s)
out(*s1);
}
void println(ll x) {
static char s[25],*s1;
s1=s;
if (!x)
*s1++='0';
if (x<0)
out('-'),x=-x;
while(x)
*s1++=x%10+'0',x/=10;
while(s1--!=s)
out(*s1);
out('\n');
}
void print(double x,int y) {
static ll mul[]= {1,10,100,1000,10000,100000,1000000,10000000,100000000,
1000000000,10000000000LL,100000000000LL,1000000000000LL,10000000000000LL,
100000000000000LL,1000000000000000LL,10000000000000000LL,100000000000000000LL
};
if (x<-1e-12)
out('-'),x=-x;
x*=mul[y];
ll x1=(ll)floor(x);
if (x-floor(x)>=0.5)
++x1;
ll x2=x1/mul[y],x3=x1-x2*mul[y];
print(x2);
if (y>0) {
out('.');
for (size_t i=1; i<y&&x3*mul[i]<mul[y]; out('0'),++i)
;
print(x3);
}
}
void println(double x,int y) {
print(x,y);
out('\n');
}
void print(char *s) {
while (*s)
out(*s++);
}
void println(char *s) {
while (*s)
out(*s++);
out('\n');
}
void flush() {
if (p1!=buf) {
fwrite(buf,1,p1-buf,stdout);
p1=buf;
}
}
~Ostream_fwrite() {
flush();
}
} Ostream;
inline void print(int x) {
Ostream.print(x);
}
inline void println(int x) {
Ostream.println(x);
}
inline void print(char x) {
Ostream.out(x);
}
inline void println(char x) {
Ostream.out(x);
Ostream.out('\n');
}
inline void print(ll x) {
Ostream.print(x);
}
inline void println(ll x) {
Ostream.println(x);
}
inline void print(double x,int y) {
Ostream.print(x,y);
}
inline void println(double x,int y) {
Ostream.println(x,y);
}
inline void print(char *s) {
Ostream.print(s);
}
inline void println(char *s) {
Ostream.println(s);
}
inline void println() {
Ostream.out('\n');
}
inline void flush() {
Ostream.flush();
}
//puts->write
char Out[OUT_SIZE],*o=Out;
inline void print1(int x) {
static char buf[15];
char *p1=buf;
if (!x)
*p1++='0';
if (x<0)
*o++='-',x=-x;
while(x)
*p1++=x%10+'0',x/=10;
while(p1--!=buf)
*o++=*p1;
}
inline void println1(int x) {
print1(x);
*o++='\n';
}
inline void print1(ll x) {
static char buf[25];
char *p1=buf;
if (!x)
*p1++='0';
if (x<0)
*o++='-',x=-x;
while(x)
*p1++=x%10+'0',x/=10;
while(p1--!=buf)
*o++=*p1;
}
inline void println1(ll x) {
print1(x);
*o++='\n';
}
inline void print1(char c) {
*o++=c;
}
inline void println1(char c) {
*o++=c;
*o++='\n';
}
inline void print1(char *s) {
while (*s)
*o++=*s++;
}
inline void println1(char *s) {
print1(s);
*o++='\n';
}
inline void println1() {
*o++='\n';
}
inline void flush1() {
if (o!=Out) {
if (*(o-1)=='\n')
*--o=0;
puts(Out);
}
}
struct puts_write {
~puts_write() {
flush1();
}
} _puts;
inline void print2(int x) {
printf("%d",x);
}
inline void println2(int x) {
printf("%d\n",x);
}
inline void print2(char x) {
printf("%c",x);
}
inline void println2(char x) {
printf("%c\n",x);
}
inline void print2(ll x) {
#ifdef _WIN32
printf("%I64d",x);
#else
#ifdef __linux
printf("%lld",x);
#else
puts("error:can't recognize the system!");
#endif
#endif
}
inline void println2(ll x) {
print2(x);
printf("\n");
}
inline void println2() {
printf("\n");
}
#undef ll
#undef OUT_SIZE
#undef BUF_SIZE
};
using namespace fastIO;
/*-------------------------- 超神读入挂 -------------------------------*/
int n, m;
int vis[maxn];
int kk[6];
struct node {
int a[6], b[6];
int id;
}a[7][maxn];
bool cmp1(node a, node b) {
return (a.a[1] < b.a[1]);
}
bool cmp2(node a, node b) {
return (a.a[2] < b.a[2]);
}
bool cmp3(node a, node b) {
return (a.a[3] < b.a[3]);
}
bool cmp4(node a, node b) {
return (a.a[4] < b.a[4]);
}
bool cmp5(node a, node b) {
return (a.a[5] < b.a[5]);
}
void in_sov() {
for(int i = 1; i <= 5; ++i) {
if(i <= m) {
//read(kk[i]);
cin >> kk[i];
}
else kk[i] = 1;
}
for(int i = 1; i <= n; ++i) {
a[1][i].id = a[2][i].id = a[3][i].id = a[4][i].id = a[5][i].id = a[6][i].id = i;
for(int j = 1; j <= 5; ++j) { // a[]
if(j <= m) {
int t;
//read(t);
cin >> t;
a[1][i].a[j] = a[2][i].a[j] = a[3][i].a[j] = a[4][i].a[j] = a[5][i].a[j] = a[6][i].a[j] = t;
}
else {
a[1][i].a[j] = a[2][i].a[j] = a[3][i].a[j] = a[4][i].a[j] = a[5][i].a[j] = a[6][i].a[j] = 0;
}
}
for(int j = 1; j <= 5; ++j) { // b[]
if(j <= m) {
int t;
read(t);
//cin >> t;
a[1][i].b[j] = a[2][i].b[j] = a[3][i].b[j] = a[4][i].b[j] = a[5][i].b[j] = a[6][i].b[j] = t;
}
else {
a[1][i].b[j] = a[2][i].b[j] = a[3][i].b[j] = a[4][i].b[j] = a[5][i].b[j] = a[6][i].b[j] = 0;
}
}
}
sort(a[1]+1,a[1]+1+n, cmp1);
sort(a[2]+1,a[2]+1+n, cmp2);
sort(a[3]+1,a[3]+1+n, cmp3);
sort(a[4]+1,a[4]+1+n, cmp4);
sort(a[5]+1,a[5]+1+n, cmp5);
int ans = 0, i = 1, j = 1, k = 1, x = 1, y = 1;
queue<int> qu;
memset(vis, 0, sizeof vis);
while(1) {
for( ; i <= n; ++i) { // A
int id = a[1][i].id;
if(a[1][i].a[1] <= kk[1]) {
vis[id]++;
if(vis[id] == 5) {
qu.push(id);
}
}
else break;
}
for( ; j <= n; ++j) { // B
int id = a[2][j].id;
if(a[2][j].a[2] <= kk[2]) {
vis[id]++;
if(vis[id] == 5) {
qu.push(id);
}
}
else break;
}
for( ; k <= n; ++k) { // C
int id = a[3][k].id;
if(a[3][k].a[3] <= kk[3]) {
vis[id]++;
if(vis[id] == 5) {
qu.push(id);
}
}
else break;
}
for( ; x <= n; ++x) { // D
int id = a[4][x].id;
if(a[4][x].a[4] <= kk[4]) {
vis[id]++;
if(vis[id] == 5) {
qu.push(id);
}
}
else break;
}
for( ; y <= n; ++y) { // E
int id = a[5][y].id;
if(a[5][y].a[5] <= kk[5]) {
vis[id]++;
if(vis[id] == 5) {
qu.push(id);
}
}
else break;
}
if(qu.empty()) break;
else {
while(!qu.empty()) {
int id = qu.front(); qu.pop();
ans++;
for(int i = 1; i <= m; ++i) {
kk[i] += a[6][id].b[i];
}
}
}
}
printf("%d\n", ans);
for(int i = 1; i <= m; ++i) {
printf("%d%c", kk[i], (i == m ? '\n' : ' '));
}
}
int main() {
int T;
//read(T);
cin >> T;
while(T--) {
//read(n);read(m);
cin >> n >> m;
in_sov();
}
return 0;
}