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 }
View Code

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,之后就很脑残了。

原文地址:https://www.cnblogs.com/OYzx/p/5792371.html