Codeforces Round #368 (Div. 2)
A:傻逼模拟题,直接上代码好了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 int n,m; 8 char st[5]; 9 bool bo; 10 int main(){ 11 scanf("%d%d",&n,&m); 12 bo=1; 13 for (int i=1;i<=n;i++){ 14 for (int j=1;j<=m;j++){ 15 scanf("%s",st+1); 16 if ((st[1]=='C') || (st[1]=='M') || (st[1]=='Y')) bo=0; 17 } 18 } 19 if (bo==1) puts("#Black&White"); 20 else puts("#Color"); 21 return 0; 22 }
B:给定n个点,m条边,k个特殊点,要求选出一个非特殊点,记这个点到某个特殊点的距离为x,最小化x,若无法找到某个非特殊点与某个特殊点连通或k=0,输出-1.
做法:我的做法:由于是到某个特殊点的最小距离,我就把所有特殊点缩成一个点,原图中的边,如果是特殊点与特殊点的边,新图中不管,如果是非与非,就照样连,健一个s点,若为非与特,则s与非连边,最后从s点跑一次单源最短路,找到最小的dist即可。
正解:由于边为非负数,所以这个点必定直接与某个特殊点相连,直接枚举每个特殊点以及与这个特殊点相邻的点,用这条边的权值更新答案即可,复杂度为O(m)。
C:勾股数的构造,给定n,输出m,k使得(n,m,k)为一组勾股数,做法:若n<=2,无解,否则,若n为奇数,m=n*n/2,k=m+1;若n为偶数,m=n*n/4-1,k=n*n/4+1;
D:题意:给定一个n*m的矩阵,初始时为0,4种操作,对于前3中操作,i-1向i连边,否则k向i连边,这是一棵树,我们dfs这个树,每个操作暴力做即可,为什么呢?因为这个题的瓶颈就在于4操作,某些操作会被做多次,这样就是nq的了。
E:题意:给定一个n*m的矩阵,有k个集合,q个操作,操作1每次把一个集合的存在性取反,操作2询问某个矩形中的存在的元素的权值和,保证询问的个数小于2000,预处理每个集合对每个询问的影响,这个怎么做呢?我们枚举每个集合,把他加进树状数组,枚举2000个询问,计算答案即可,复杂度n^2logn^2+qlogn^2,之后就很脑残了。