我要举报本次校赛出题人的消极出题!!!
官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解)
A. 树链剖分数据结构板题
题目大意:我没看,看不懂。
基本思路:我不会。
参考代码:找Oyk老师和Czj老师去。
B. The background of water problem
题目大意(大写加粗的水题):给定$N$个学生和他们$K$个科目的成绩$S_i$,再给出各科目$K_i$的权重顺序$Q_i$,求排名之后,拥有id为$X$的是哪个学生。
基本思路:虽然$K$只有$10$,$S$只有$100$,但有M组查询,所以当然不能开个long long去hash每个学生。我们简单点,开个结构体,排个序,就好了。
参考代码:
官方代码(将成绩和id分开放,避免在排序时复制构造大结构体):
1 #include <cstdio> 2 #include <string.h> 3 #include <algorithm> 4 #include <vector> 5 using namespace std; 6 7 int N,K,M,X; 8 int people[1005][11]; 9 int cmpOrder[11]; 10 11 struct CmpNode{ 12 CmpNode(int x):id(x){} 13 int id; 14 bool operator < (const CmpNode &other) const 15 { 16 for(int i=0; i<K; i++) 17 { 18 if(people[this->id][cmpOrder[i]] > people[other.id][cmpOrder[i]]) 19 return true; 20 else if(people[this->id][cmpOrder[i]] < people[other.id][cmpOrder[i]]) 21 return false; 22 } 23 return this->id<other.id; 24 } 25 }; 26 27 void solve(FILE *fin=stdin, FILE *fout=stdout) 28 { 29 int t; 30 fscanf(fin,"%d",&t); 31 while(t--) 32 { 33 fscanf(fin,"%d%d",&N,&K); 34 vector<CmpNode> nodes; 35 for(int i=0;i<N;i++) 36 { 37 nodes.push_back(CmpNode(i)); 38 for(int j=1;j<=K;j++) 39 fscanf(fin,"%d",&people[i][j]); 40 } 41 fscanf(fin,"%d",&M); 42 while(M--) 43 { 44 for(int i=0;i<K;i++) 45 fscanf(fin,"%d",cmpOrder+i); 46 fscanf(fin,"%d", &X); 47 sort(nodes.begin(),nodes.end()); 48 fprintf(fout,"%d\n",nodes[X-1].id+1); 49 } 50 } 51 } 52 53 int main() 54 { 55 solve(stdin,stdout); 56 return 0; 57 }