Codeforces Round #766 (Div. 2)
题目链接:https://codeforces.com/contest/1627
A
第r行j列的小块分为三种情况:
-
0次: 目标小块已经是黑色。
-
1次:目标小块是白色,且所在行或列有黑色小块。
-
2次:目标小块是白色,且所在行和列均为白色,矩形内存在黑色小块。
-
-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;
}