慢走
不送
写的真滴捞!!!
留下做纪念
按照每个魔法类型,分别用不同的数组保存并排序,根据当前各类型魔法值选择相应的合法的魔法类型标记
这是On复杂度,前面排序需要O(nlogn)复杂度
#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;
/*-------------------------- 超神读入挂 -------------------------------*/
//inline bool read(int &num)
//{
// char in;bool IsN=false;
// in=getchar();
// if(in==EOF) return false;
// while(in!='-'&&(in<'0'||in>'9')) in=getchar();
// if(in=='-'){ IsN=true;num=0;}
// else num=in-'0';
// while(in=getchar(),in>='0'&&in<='9'){
// num*=10,num+=in-'0';
// }
// if(IsN) num=-num;
// return true;
//}
int T, n, k_;
int vis[maxn];
int kk[5];
//inline void read(int &x) {
// char ch = getchar();
// x = 0;
// for (; ch < '0' || ch > '9'; ch = getchar());
// for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
//}
//inline void print(int x) {
// if(x > 9) {
// print(x/10);
// }
// putchar(x%10+'0');
//}
struct node {
int id;
int a, b, c, d, e;
int a_, b_, c_, d_, e_;
} a[maxn], b[maxn], c[maxn], d[maxn], e[maxn], f[maxn];
bool cmp1(node a, node b) {
return (a.a < b.a);
}
bool cmp2(node a, node b) {
return (a.b < b.b);
}
bool cmp3(node a, node b) {
return (a.c < b.c);
}
bool cmp4(node a, node b) {
return (a.d < b.d);
}
bool cmp5(node a, node b) {
return (a.e < b.e);
}
void init1() {
int t;
for(int i = 1; i <= n; ++i) {
a[i].id = b[i].id = i;
read(t);
a[i].a = b[i].a = t;
read(t);
a[i].a_ = b[i].a_ = t;
}
sort(b+1,b+1+n,cmp1);
int i = 1, cnt = 0;
queue<int> qu;
memset(vis, 0, sizeof vis);
while(1) {
for( ; i <= n; ++i) {
if(b[i].a <= kk[1]) {
vis[b[i].id]++;
if(vis[b[i].id] == 1) {
qu.push(b[i].id);
}
}
else break;
}
if(qu.empty()) break;
else {
while(!qu.empty()) {
cnt++;
int idd = qu.front(); qu.pop();
kk[1] += a[idd].a_;
}
}
}
//for(int i = 1; i <= k; ++i) {
// print(cnt);
// puts("");
// print(kk[1]);
printf("%d\n%d\n", cnt, kk[1]);
//}
}
void init2() {
int t;
for(int i = 1; i <= n; ++i) {
a[i].id = b[i].id = c[i].id = i;
read(t);
a[i].a = b[i].a = c[i].a = t;
read(t);
a[i].b = b[i].b = c[i].b = t;
read(t);
a[i].a_ = b[i].a_ = c[i].a_ = t;
read(t);
a[i].b_ = b[i].b_ = c[i].b_ = t;
}
sort(b+1,b+1+n,cmp1);
sort(c+1,c+1+n,cmp2);
int i = 1, j = 1, cnt = 0;
queue<int> qu;
memset(vis, 0, sizeof vis);
while(1) {
for( ; i <= n; ++i) {
if(b[i].a <= kk[1]) {
vis[b[i].id]++;
if(vis[b[i].id] == 2) {
qu.push(b[i].id);
}
}
else break;
}
for( ; j <= n; ++j) {
if(c[j].b <= kk[2]) {
vis[c[j].id]++;
if(vis[c[j].id] == 2) {
qu.push(c[j].id);
}
}
else break;
}
if(qu.empty()) break;
else {
while(!qu.empty()) {
cnt++;
int idd = qu.front(); qu.pop();
kk[1] += a[idd].a_;
kk[2] += a[idd].b_;
}
}
}
//for(int i = 1; i <= k; ++i) {
// print(cnt);
// puts("");
// print(kk[1]);
// putchar(' '); print(kk[2]);
printf("%d\n%d %d\n", cnt, kk[1], kk[2]);
//}
}
void init3() {
int t;
for(int i = 1; i <= n; ++i) {
a[i].id = b[i].id = c[i].id = d[i].id = i;
read(t);
//cin >> t;
a[i].a = b[i].a = c[i].a = d[i].a = t;
read(t);
//cin >> t;
a[i].b = b[i].b = c[i].b = d[i].b = t;
read(t);
//cin >> t;
a[i].c = b[i].c = c[i].c = d[i].c = t;
read(t);
//cin >> t;
a[i].a_ = b[i].a_ = c[i].a_ = d[i].a_ = t;
read(t);
//cin >> t;
a[i].b_ = b[i].b_ = c[i].b_ = d[i].b_ = t;
read(t);
//cin >> t;
a[i].c_ = b[i].c_ = c[i].c_ = d[i].c_ = t;
}
sort(b+1,b+1+n,cmp1);
sort(c+1,c+1+n,cmp2);
sort(d+1,d+1+n,cmp3);
int i = 1, j = 1, k = 1, cnt = 0;
queue<int> qu;
memset(vis, 0, sizeof vis);
while(1) {
for( ; i <= n; ++i) {
//cout << i << " iiii " << endl;
if(b[i].a <= kk[1]) {
vis[b[i].id]++;
if(vis[b[i].id] == 3) {
qu.push(b[i].id);
}
}
else break;
}
for( ; j <= n; ++j) {
//cout << j << " jjjj " << endl;
if(c[j].b <= kk[2]) {
vis[c[j].id]++;
if(vis[c[j].id] == 3) {
qu.push(c[j].id);
}
}
else break;
}
for( ; k <= n; ++k) {
//cout << k << " kkkk " << endl;
if(d[k].c <= kk[3]) {
vis[d[k].id]++;
if(vis[d[k].id] == 3) {
qu.push(d[k].id);
}
}
else break;
}
if(qu.empty()) break;
else {
while(!qu.empty()) {
cnt++;
int idd = qu.front(); qu.pop();
//cout << idd << " idddd " << endl;
kk[1] += a[idd].a_;
kk[2] += a[idd].b_;
kk[3] += a[idd].c_;
}
}
}
//for(int i = 1; i <= k; ++i) {
// print(cnt);
// puts("");
// print(kk[1]);
// putchar(' '); print(kk[2]);
// putchar(' '); print(kk[3]);
printf("%d\n%d %d %d\n", cnt, kk[1], kk[2], kk[3]);
//}
}
void init4() {
int t;
for(int i = 1; i <= n; ++i) {
a[i].id = b[i].id = c[i].id = d[i].id = e[i].id = i;
read(t);
a[i].a = b[i].a = c[i].a = d[i].a = e[i].a = t;
read(t);
a[i].b = b[i].b = c[i].b = d[i].b = e[i].b = t;
read(t);
a[i].c = b[i].c = c[i].c = d[i].c = e[i].c = t;
read(t);
a[i].d = b[i].d = c[i].d = d[i].d = e[i].d = t;
read(t);
a[i].a_ = b[i].a_ = c[i].a_ = d[i].a_ = e[i].a_ = t;
read(t);
a[i].b_ = b[i].b_ = c[i].b_ = d[i].b_ = e[i].b_ = t;
read(t);
a[i].c_ = b[i].c_ = c[i].c_ = d[i].c_ = e[i].c_ = t;
read(t);
a[i].d_ = b[i].d_ = c[i].d_ = d[i].d_ = e[i].d_ = t;
}
sort(b+1,b+1+n,cmp1);
sort(c+1,c+1+n,cmp2);
sort(d+1,d+1+n,cmp3);
sort(e+1,e+1+n,cmp4);
int i = 1, j = 1, k = 1, x = 1, cnt = 0;
queue<int> qu;
memset(vis, 0, sizeof vis);
while(1) {
for( ; i <= n; ++i) {
if(b[i].a <= kk[1]) {
vis[b[i].id]++;
if(vis[b[i].id] == 4) {
qu.push(b[i].id);
}
}
else break;
}
for( ; j <= n; ++j) {
if(c[j].b <= kk[2]) {
vis[c[j].id]++;
if(vis[c[j].id] == 4) {
qu.push(c[j].id);
}
}
else break;
}
for( ; k <= n; ++k) {
if(d[k].c <= kk[3]) {
vis[d[k].id]++;
if(vis[d[k].id] == 4) {
qu.push(d[k].id);
}
}
else break;
}
for( ; x <= n; ++x) {
if(e[x].d <= kk[4]) {
vis[e[x].id]++;
if(vis[e[x].id] == 4) {
qu.push(e[x].id);
}
}
else break;
}
if(qu.empty()) break;
else {
while(!qu.empty()) {
cnt++;
int idd = qu.front(); qu.pop();
kk[1] += a[idd].a_;
kk[2] += a[idd].b_;
kk[3] += a[idd].c_;
kk[4] += a[idd].d_;
}
}
}
//for(int i = 1; i <= k; ++i) {
// print(cnt);
// puts("");
// print(kk[1]);
// putchar(' '); print(kk[2]);
// putchar(' '); print(kk[3]);
// putchar(' '); print(kk[4]);
printf("%d\n%d %d %d %d\n",cnt, kk[1], kk[2], kk[3], kk[4]);
//}
}
void init5() {
int t;
for(int i = 1; i <= n; ++i) {
a[i].id = b[i].id = c[i].id = d[i].id = e[i].id = f[i].id = i;
read(t);
a[i].a = b[i].a = c[i].a = d[i].a = e[i].a = f[i].a = t;
read(t);
a[i].b = b[i].b = c[i].b = d[i].b = e[i].b = f[i].b = t;
read(t);
a[i].c = b[i].c = c[i].c = d[i].c = e[i].c = f[i].c = t;
read(t);
a[i].d = b[i].d = c[i].d = d[i].d = e[i].d = f[i].d = t;
read(t);
a[i].e = b[i].e = c[i].e = d[i].e = e[i].e = f[i].e = t;
read(t);
a[i].a_ = b[i].a_ = c[i].a_ = d[i].a_ = e[i].a_ = f[i].a_ = t;
read(t);
a[i].b_ = b[i].b_ = c[i].b_ = d[i].b_ = e[i].b_ = f[i].b_ = t;
read(t);
a[i].c_ = b[i].c_ = c[i].c_ = d[i].c_ = e[i].c_ = f[i].c_ = t;
read(t);
a[i].d_ = b[i].d_ = c[i].d_ = d[i].d_ = e[i].d_ = f[i].d_ = t;
read(t);
a[i].e_ = b[i].e_ = c[i].e_ = d[i].e_ = e[i].e_ = f[i].e_ = t;
}
sort(b+1,b+1+n,cmp1);
sort(c+1,c+1+n,cmp2);
sort(d+1,d+1+n,cmp3);
sort(e+1,e+1+n,cmp4);
sort(f+1,f+1+n,cmp5);
int i = 1, j = 1, k = 1, x = 1, y = 1, cnt = 0;
queue<int> qu;
memset(vis, 0, sizeof vis);
while(1) {
for( ; i <= n; ++i) {
if(b[i].a <= kk[1]) {
vis[b[i].id]++;
if(vis[b[i].id] == 5) {
qu.push(b[i].id);
}
}
else break;
}
for( ; j <= n; ++j) {
if(c[j].b <= kk[2]) {
vis[c[j].id]++;
if(vis[c[j].id] == 5) {
qu.push(c[j].id);
}
}
else break;
}
for( ; k <= n; ++k) {
if(d[k].c <= kk[3]) {
vis[d[k].id]++;
if(vis[d[k].id] == 5) {
qu.push(d[k].id);
}
}
else break;
}
for( ; x <= n; ++x) {
if(e[x].d <= kk[4]) {
vis[e[x].id]++;
if(vis[e[x].id] == 5) {
qu.push(e[x].id);
}
}
else break;
}
for( ; y <= n; ++y) {
if(f[y].e <= kk[5]) {
vis[f[y].id]++;
if(vis[f[y].id] == 5) {
qu.push(f[y].id);
}
}
else break;
}
if(qu.empty()) break;
else {
while(!qu.empty()) {
cnt++;
int idd = qu.front(); qu.pop();
kk[1] += a[idd].a_;
kk[2] += a[idd].b_;
kk[3] += a[idd].c_;
kk[4] += a[idd].d_;
kk[5] += a[idd].e_;
}
}
}
//for(int i = 1; i <= k; ++i) {
// print(cnt);
// puts("");
// print(kk[1]);
// putchar(' '); print(kk[2]);
// putchar(' '); print(kk[3]);
// putchar(' '); print(kk[4]);
// putchar(' '); print(kk[5]);
printf("%d\n%d %d %d %d %d\n",cnt, kk[1], kk[2], kk[3], kk[4], kk[5]);
//}
}
int main() {
//fread(Buf,1,BUF,stdin);
//scanf("%d", &T);
//cin >> T;
read(T);//cout << 377777 << endl;
while(T--) {
//scanf("%d%d", &n, &k);
read(n);
read(k_);
//cin >> n >> k_;
for(int i = 1; i <= k_; ++i) {
read(kk[i]);
//cin >> kk[i];
//scanf("%d", &kk[i]);
}
//cout << n << "===" << k_ << endl;
if(k_ == 1) {
init1();
} else if(k_ == 2) {
init2();
} else if(k_ == 3) {
init3();
} else if(k_ == 4) {
init4();
} else if(k_ == 5) {
init5();
}
}
//fwrite(Out,1,ou-Out,stdout);
return 0;
}