CF #254 div2

2014-07-07 00:11:15

又一Chinese Round!风格一如既往,十分注重算法和数据结构。

A,一开始傻吊地以为挨个判断就可以,后来想想不行,因为前面的格子会影响后面的。所以DFS一下可以AC。结果到了赛后,发现一个简洁到家的思路!:根据row,colmn直接建图

B,W相间,然后有'-'的去掉。。。。。。。我去!

B,这题绝杀了(虽然只有可怜380+的分儿),思路:并查集,能相互react的在一颗树里,最后考虑每颗树的枝干数k(总节点数 - 1),2^k即为结果

C,D都没做到 QAQ,弱成渣渣了,哎,路漫漫其修远兮!

代码:

A(无脑DFS版本,TAT我都不忍心贴了,别人直接10行搞定):

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <cmath>
 5 #include <cstring>
 6 using namespace std;
 7 
 8 int r,c,used[105][105];
 9 char g[105][105];
10 
11 void Dfs(int x,int y){
12     if(x < 0 || x >= r || y < 0 || y >= c || used[x][y] || g[x][y] == '-')
13         return;
14     used[x][y] = 1;
15     if(g[x - 1][y] == 'W')
16         g[x][y] = 'B';
17     else if(g[x - 1][y] == 'B')
18         g[x][y] = 'W';
19 
20     if(g[x + 1][y] == 'W')
21         g[x][y] = 'B';
22     else if(g[x + 1][y] == 'B')
23         g[x][y] = 'W';
24 
25     if(g[x][y - 1] == 'W')
26         g[x][y] = 'B';
27     else if(g[x][y - 1] == 'B')
28         g[x][y] = 'W';
29 
30     if(g[x][y + 1] == 'W')
31         g[x][y] = 'B';
32     else if(g[x][y + 1] == 'B')
33         g[x][y] = 'W';
34 
35     if(g[x][y] == '.'){
36         g[x][y] = 'B';
37     }
38     Dfs(x - 1,y);
39     Dfs(x + 1,y);
40     Dfs(x,y - 1);
41     Dfs(x,y + 1);
42 }
43 
44 int main(){
45     scanf("%d %d",&r,&c);
46     getchar();
47     for(int i = 0; i < r; ++i){
48         gets(g[i]);
49     }
50     for(int i = 0; i < r; ++i){
51         for(int j = 0; j < c; ++j){
52             if(g[i][j] == '.'){
53                 Dfs(i,j);
54             }
55             printf("%c",g[i][j]);
56         }
57         puts("");
58     }
59     return 0;
60 }

B(并查集绝杀版):

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 int fa[55];
 9 int n,m;
10 
11 int Find(int x){
12     if(fa[x] != x) return Find(fa[x]);
13     return fa[x];
14 }
15 
16 void Union(int a,int b){
17     int x = Find(a);
18     int y = Find(b);
19     if(x != y){
20         if(x < y)
21             fa[y] = x;
22         else
23             fa[x] = y;
24     }
25 }
26 
27 int main(){
28     int a,b;
29     scanf("%d %d",&n,&m);
30     for(int i = 1; i <= n; ++i){
31         fa[i] = i;
32     }
33     while(m--){
34         scanf("%d %d",&a,&b);
35         Union(a,b);
36     }
37     long long re = 1;
38     int cnt[55];
39     memset(cnt,0,sizeof(cnt));
40     for(int i = 1; i <= n; ++i){
41         cnt[Find(i)]++;
42     }
43     for(int i = 1; i <= n; ++i){
44         if(cnt[i] > 1){
45             re <<= (cnt[i] - 1);
46         }
47     }
48     printf("%I64d\n",re);
49     return 0;
50 }

 

 

posted @ 2014-07-07 00:22  Naturain  阅读(167)  评论(0)    收藏  举报