HDU-6396 Swordsman nlogn模拟?暴力?

主代码请空降至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;
}









猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/81661590