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 }

浙公网安备 33010602011771号