1 #include
2 #include
3 #include
4 #include
5 using namespace std;
6 #define maxn 51
7 #define inf 1e9
8 int map[maxn][maxn];
9 int mx[maxn];
10 int n,m,mnum,sum;
11 int lx[maxn],ly[maxn];
12 int tlx[maxn],tly[maxn];
13 void init(){
14 int t;
15 sum=0;mnum=0;
16 for(int i=1;i<=n;i++)lx[i]=-inf;
17 for(int i=1;i<=m;i++)ly[i]=0;
18 for(int i=1;i<=n;i++){
19 for(int j=1;j<=m;j++){
20 scanf("%d",&map[i][j]);
21 map[i][j]*=100;
22 }
23 }
24 for(int i=1;i<=n;i++){
25 scanf("%d",&mx[i]);
26 sum+=map[i][mx[i]];
27 map[i][mx[i]]+=1;
28 }
29 for(int i=1;i<=n;i++){
30 for(int j=1;j<=m;j++)if(map[i][j]>lx[i]) lx[i]=map[i][j];
31 }
32 }
33 int my[maxn],slack;
34 bool visx[maxn],visy[maxn];
35 bool dfs(int u){
36 visx[u]=true;
37 for(int v=1;v<=m;v++)if(!visy[v]){
38 int t=lx[u]+ly[v]-map[u][v];
39 if(!t){
40 visy[v]=true;
41 if(my[v]==-1 || dfs(my[v])){
42 my[v]=u; return true;
43 }
44 }else if(tt;
45 }
46 return false;
47 }
48 int km(){
49 int ans=0;
50 memset(my,-1,sizeof(my));
51 for(int i=1;i<=n;i++){
52 while(1){
53 memset(visx,0,sizeof(visx));
54 memset(visy,0,sizeof(visy));
55 slack=inf;
56 if(dfs(i)) break;
57 for(int j=1;j<=n;j++)if(visx[j]) lx[j]-=slack;
58 for(int j=1;j<=m;j++)if(visy[j]) ly[j]+=slack;
59 }
60 }
61 for(int i=1;i<=m;i++){
62 if(my[i]!=-1){
63 ans+=ly[i]+lx[my[i]];
64 }
65 }
66 return ans;
67 }
68 int main()
69 {
70 freopen("in.txt","r",stdin);
71 while(scanf("%d%d",&n,&m)!=EOF){
72 init();
73 mnum=km();
74 printf("%d %d\n",n-mnum%100,mnum/100-sum/100);
75 }
76 return 0;
77 }