VP TOYOTA SYSTEMS Programming Contest 2024(AtCoder Beginner Contest 377)
A - Rearranging ABC
点击查看代码
void solve() {
int cnt[26]{};
std::string s;
std::cin >> s;
for (auto & c : s) {
++ cnt[c - 'A'];
}
if (cnt[0] == cnt[1] && cnt[1] == cnt[2] && cnt[2] == 1) {
std::cout << "Yes\n";
} else {
std::cout << "No\n";
}
}
B - Avoid Rook Attack
题意:棋盘上有
记录被吃的行和列。一个格子不会被吃那么它所在的行列都不会被吃。
点击查看代码
void solve() {
int n = 8;
std::vector<std::string> s(n);
for (int i = 0; i < n; ++ i) {
std::cin >> s[i];
}
std::vector<int> row(n), col(n);
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
if (s[i][j] == '#') {
row[i] = col[j] = 1;
}
}
}
int ans = 0;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
ans += row[i] == 0 && col[j] == 0;
}
}
std::cout << ans << "\n";
}
C - Avoid Knight Attack
题意:棋盘上有
把被吃的格子用
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
const int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2}, dy[] = {1, 2, 2, 1, -1, -2, -2, -1};
std::set<std::pair<int, int>> s;
for (int i = 0; i < m; ++ i) {
int x, y;
std::cin >> x >> y;
-- x, -- y;
s.insert({x, y});
for (int j = 0; j < 8; ++ j) {
int nx = x + dx[j], ny = y + dy[j];
if (nx < 0 || nx >= n || ny < 0 || ny >= n) {
continue;
}
s.insert({nx, ny});
}
}
std::cout << (i64)n * n - (int)s.size() << "\n";
}
D - Many Segments 2
题意:有
把每个右端点对应的左端点存下来。然后枚举右端点,这个右端点可以往左取到的地方就是前面所有区间的
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<std::vector<int>> R(m + 1);
for (int i = 0; i < n; ++ i) {
int l, r;
std::cin >> l >> r;
R[r].push_back(l);
}
i64 ans = 0;
int l = 0;
for (int r = 1; r <= m; ++ r) {
for (auto & p : R[r]) {
l = std::max(l, p);
}
ans += r - l;
}
std::cout << ans << "\n";
}
E - Permute K times 2
题意:给你一个排列,每次使得
如果按
点击查看代码
void solve() {
int n;
i64 k;
std::cin >> n >> k;
std::vector<int> p(n);
for (int i = 0; i < n; ++ i) {
std::cin >> p[i];
-- p[i];
}
auto power = [&](int a, i64 b, int m) -> int {
int res = 1;
for (; b; b >>= 1, a = (i64)a * a % m) {
if (b & 1) {
res = (i64)res * a % m;
}
}
return res;
};
std::vector<int> st(n), ans(n);
for (int i = 0; i < n; ++ i) {
if (!st[i]) {
int j = i;
std::vector<int> a;
while (!st[j]) {
st[j] = 1;
a.push_back(j);
j = p[j];
}
int m = a.size();
int d = power(2, k, m);
for (int i = 0; i < m; ++ i) {
ans[a[i]] = p[a[(i + d - 1 + m) % m]];
}
}
}
for (int i = 0; i < n; ++ i) {
std::cout << ans[i] + 1 << " \n"[i == n - 1];
}
}
G - Edit to Match
题意:依次输入
建立一棵字典树,对于字典树的每一个节点
点击查看代码
const int TrieN = 1e6 + 5;
int trie[TrieN][26], f[TrieN * 26];
struct Trie {
int idx;
Trie() {
idx = 0;
}
int newNode() {
idx += 1;
memset(trie[idx], 0, sizeof trie[idx]);
f[idx] = 1e9;
return idx;
}
int insert(const std::string & s) {
int p = 0;
std::vector<int> a;
int res = 1e9;
int len = s.size();
for (auto & c : s) {
int x = c - 'a';
if (!trie[p][x]) {
trie[p][x] = newNode();
}
p = trie[p][x];
-- len;
res = std::min(res, f[p] + len);
a.push_back(p);
}
int n = a.size();
f[a[n - 1]] = 0;
for (int i = n - 2; i >= 0; -- i) {
f[a[i]] = std::min(f[a[i]], f[a[i + 1]] + 1);
}
return res;
}
};
void solve() {
int n;
std::cin >> n;
Trie tr;
for (int i = 0; i < n; ++ i) {
std::string s;
std::cin >> s;
std::cout << std::min((int)s.size(), tr.insert(s)) << "\n";
}
}
分类:
atcoder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!