总共十道题, 又结束了一场逗比的比赛, 感觉后半场都在梦游,结果被虐了!!!!大家都虐我一万里啊。
正如wushen说的,“那些被虐过的比赛,唯有赛后AK掉来泄愤。”
本弱太菜,还达不到AK的境界,只能搞出这场的8道题。
A
一个很神奇的题目,全场就坑在这题了,其实应该画几组去看看的,比较容易发现规律的。
根据规则可以知道,一个数想要往下走一行,必须有个比它小的数在后面插入,把它推下去。
题目要求输出逆序 后 字典序最大的结果。
其实首先要每行是递增的。
然后每一行的数,在上一行找一个比它小,而且没有使用过的。
然后就形成了一颗颗链, 把链输出就是结果了。
也可以使用拓扑排序,结果是一样的。
这题就是要靠智商啊,要锻炼自己YY的能力了。
来代码吧!
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2014/5/21 11:38:45 4 File Name :E:\2014ACM\比赛\2014北京邀请赛\A.cpp 5 ************************************************ */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17 #include <stdlib.h> 18 #include <time.h> 19 using namespace std; 20 const int MAXN = 100010; 21 vector<int>vec[MAXN]; 22 int pre[MAXN]; 23 vector<int>ans; 24 void add(int u) 25 { 26 if(u == -1)return ; 27 add(pre[u]); 28 ans.push_back(u); 29 } 30 31 int main() 32 { 33 //freopen("in.txt","r",stdin); 34 //freopen("out.txt","w",stdout); 35 int T; 36 int iCase = 0; 37 scanf("%d",&T); 38 int n,m; 39 while(T--) 40 { 41 iCase++; 42 scanf("%d%d",&n,&m); 43 for(int i = 0;i < m;i++) 44 vec[i].clear(); 45 for(int i = 0;i < m;i++) 46 { 47 int num; 48 int x; 49 scanf("%d",&num); 50 while(num--) 51 { 52 scanf("%d",&x); 53 vec[i].push_back(x); 54 } 55 } 56 bool flag = true; 57 for(int i = 0;i < m;i++) 58 { 59 int sz = vec[i].size(); 60 for(int j = 1;j < sz;j++) 61 if(vec[i][j] < vec[i][j-1]) 62 { 63 flag = false; 64 break; 65 } 66 } 67 if(!flag) 68 { 69 printf("Case #%d: No solution\n",iCase); 70 continue; 71 } 72 memset(pre,-1,sizeof(pre)); 73 for(int i = m-1;i > 0;i--) 74 { 75 int sz = vec[i].size(); 76 int p = vec[i-1].size(); 77 for(int j = sz-1;j >= 0;j--) 78 { 79 if(p <= 0) 80 { 81 flag = false; 82 break; 83 } 84 p = lower_bound(vec[i-1].begin(),vec[i-1].begin()+p,vec[i][j]) - vec[i-1].begin() + 1; 85 p--; 86 if(p <= 0) 87 { 88 flag = false; 89 break; 90 } 91 pre[vec[i-1][p-1]] = vec[i][j]; 92 p--; 93 } 94 } 95 if(!flag) 96 { 97 printf("Case #%d: No solution\n",iCase); 98 continue; 99 } 100 ans.clear(); 101 for(int i = 0;i < vec[0].size();i++) 102 add(vec[0][i]); 103 printf("Case #%d:",iCase); 104 for(int i = 0;i < n;i++) 105 printf(" %d",ans[i]); 106 printf("\n"); 107 } 108 109 return 0; 110 }