Codeforces Round #766 (Div. 2)


题目链接:https://codeforces.com/contest/1627

A

第r行j列的小块分为三种情况:

  1. 0次: 目标小块已经是黑色。

  2. 1次:目标小块是白色,且所在行或列有黑色小块。

  3. 2次:目标小块是白色,且所在行和列均为白色,矩形内存在黑色小块。

  4. -1:矩形内全部为白色小块。

#include 
#include 
#include 
using namespace std;
const int N = 60;
char s[N][N];
int t;
int n,m,r,c;
void solve()
{
    int b = 0;
    cin >> n >> m >> r >> c;
    for (int i = 1; i <= n; i ++ ) {
        for (int j = 1; j <= m; j ++ ) {
            cin >> s[i][j];
            if(s[i][j] == 'B') b = 1;
        }
    }
    if(!b) {
        cout << -1 << endl;
        return ;
    }
    else {
        if(s[r][c] == 'B') {
            cout << 0 << endl;
            return ;
        }
        for (int i = 1 ; i <= n ; i ++ ) {
            if(s[i][c] == 'B') {
                cout << 1 << endl;
                return ;
            }
        }
        for (int i = 1 ; i <= m ; i ++ ) {
            if(s[r][i] == 'B') {
                cout << 1 << endl;
                return ;
            }
        }
        cout << 2 << endl;
    }
    return ;
}
int main()
{
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

B

根据两个人坐位的要求,能够得到 Tina 一定会坐在四个角上的其中一个位置,同时题中给出 n*m 的范围不会超过\(10^5\)

所以可以遍历每一个位置,找到每个位置与四个角的最大距离,然后将这些距离按照从小到大依次输出 n*m-1 个。

#include 
using namespace std;
int t,n,m;
void solve()
{
	vector v; 
	cin >> n >> m;
	for (int i = 1 ; i <= n ; i ++ ) {
		for (int j = 1 ; j <= m ; j ++ ) {
			v.push_back(max(i-1,n-i) + max(j-1,m-j));
		}
	}
	sort(v.begin(),v.end());
	for (int i = 0 ; i < n*m ; i ++ ) cout << v[i] << ' ';
	cout << endl;
	return ;
}
int main()
{
	cin >> t;
	while(t -- ) {
		solve();
	}
	return 0;
} 

C

假设某个点存在3条边满足题目条件,设其权值分别为 x,y,z ,那么有 x,y,z>=2 【2是最小的素数】,

则有 x+y >= 4 , x+z >= 4 , y+z >= 4,且因为它们之和为奇数,则 x与y,y与z,z与x 的奇偶性相反,

显然不成立,所以得出某个点只能存在 1~2 条边,不能存在3条及3条以上的边。

通过该结论可以得到当 n>=2 时,无向图有两个度为 1 的点,

从其中一个点进行 dfs ,将其边权依次确定为2和3,就可以满足题目条件。【2 + 3 = 5,三个均为素数】

#include 
using namespace std;
typedef pair PII;
const int N = 1e5+10;

int n,c[N];
vector v[N];
map mp;

void dfs(int son,int father,int co) {
	for (int i = 0 ; i < v[son].size() ; i ++ ) {
		if(v[son][i] != father) {
			c[mp[{son,v[son][i]}]] = co ^ 1;
			dfs(v[son][i],son,co ^ 1);
		}
	}
}

void solve()
{
	mp.clear();
	for (int i = 0 ; i < N ; i ++ ) v[i].clear(),c[i] = 0;
	
	int a,b; 
	cin >> n;
	
	for (int i = 1 ; i < n ; i ++ ) {
		cin >> a >> b;
		mp[{a,b}] = i;
		mp[{b,a}] = i;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for (int i = 1 ; i <= n ; i ++ ) if(v[i].size() >= 3) {cout << -1 << endl;return ;}
	for (int i = 1 ; i <= n ; i ++ ) if(v[i].size() == 1) {dfs(i,0,0);break;}
	for (int i = 1 ; i < n ; i ++ ) {cout << c[i]+2 << ' ';}
	cout << endl;
	return ;
}

int main()
{
	int t;
	cin >> t;
	while(t -- ) {
		solve();
	}
	return 0;
}