上周六咕咕咕了
省流版
- A. 排序判断即可
- B. 枚举判断即可
- C. 记录覆盖位置去重,总数-覆盖数即可
- D. 枚举右端点,考虑符合条件的左端点数量即可
- E. 考虑排列的\(i \to p_i\)图,考虑操作数与走的边数关系,利用环循环节算偏移量即可
- F. 考虑每个皇后实际覆盖的位置,枚举先前皇后计算覆盖交集去重,累加实际覆盖数即可
- G. 将操作转换成
Tries
树的节点移动,即一条链上的到达最近叶子的距离,取最小值即可
A - Rearranging ABC (abc377 A)
题目大意
给定三个字母,问能否组成ABC
。
解题思路
排个序看是否是ABC
即可。
神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string s;
cin >> s;
sort(s.begin(), s.end());
if (s == "ABC")
cout << "Yes" << '\n';
else
cout << "No" << '\n';
return 0;
}
B - Avoid Rook Attack (abc377 B)
题目大意
国际象棋,车,上下左右任意走,
\(8 \times 8\)的棋盘,给定 \(m\)个车的位置。
问有多少位置,不会被车的范围覆盖。
解题思路
一个车就覆盖一行和一列。
因此就set
记录被覆盖了的行和列,最后还有\(x\)行和 \(y\)列没覆盖,答案就是 \(xy\)。
当然直接花 \(O(8^4)\)枚举位置+判断是否被覆盖也可以。
神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
set<int> r, c;
for (int i = 0; i < 8; ++i) {
string s;
cin >> s;
for (int j = 0; j < 8; ++j)
if (s[j] == '#') {
r.insert(i);
c.insert(j);
}
}
int ans = (8 - r.size()) * (8 - c.size());
cout << ans << '\n';
return 0;
}
C - Avoid Knight Attack (abc377 C)
题目大意
国际象棋,马,八个方向的日
字走法。
\(n \times n\)的棋盘,给定 \(m\)个马的位置。
问有多少位置,不会被马的范围覆盖。
解题思路
因为一个
标签:AtCoder,覆盖,Beginner,int,long,forbid,x2,y2,377 From: https://www.cnblogs.com/Lanly/p/18513188