AtCoder Beginner Contest 395
A - Strictly Increasing?
题意:判断A是不是严格递增。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
for (int i = 1; i < n; ++ i) {
if (a[i] <= a[i - 1]) {
std::cout << "No\n";
return;
}
}
std::cout << "Yes\n";
}
B - Make Target
按题意直接模拟模拟。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<std::string> s(n, std::string(n, '.'));
for (int i = 0; i < n; ++ i) {
int j = n - i - 1;
if (i <= j) {
char c = i % 2 ? '.' : '#';
for (int x = i; x <= j; ++ x) {
for (int y = i; y <= j; ++ y) {
s[x][y] = c;
}
}
}
}
for (int i = 0; i < n; ++ i) {
std::cout << s[i] << "\n";
}
}
C - Shortest Duplicate Subarray
题意:求最短的有至少两个一样元素的子数组长度。
从前往后记录每个数出现的上一个位置。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
const int N = 1e6 + 5;
std::vector<int> last(N, -1);
int ans = -1;
for (int i = 0; i < n; ++ i) {
if (last[a[i]] != -1) {
if (ans == -1 || i - last[a[i]] + 1 < ans) {
ans = i - last[a[i]] + 1;
}
}
last[a[i]] = i;
}
std::cout << ans << "\n";
}
D - Pigeon Swap
题意:有
- 把第
个鸽子放到第 个巢穴。 - 把第
个巢穴的鸽子和第 个巢穴的鸽子交换。 - 询问第
个鸽子在第几个巢穴。
转换一下题意,第
那么记
那么对于每个询问,我们直接输出
点击查看代码
void solve() {
int n, q;
std::cin >> n >> q;
std::vector<int> ida(n), idb(n), idc(n);
std::iota(ida.begin(), ida.end(), 0);
std::iota(idb.begin(), idb.end(), 0);
std::iota(idc.begin(), idc.end(), 0);
while (q -- ) {
int op;
std::cin >> op;
if (op == 1) {
int a, b;
std::cin >> a >> b;
-- a, -- b;
ida[a] = idb[b];
} else if (op == 2) {
int a, b;
std::cin >> a >> b;
-- a, -- b;
std::swap(idc[idb[a]], idc[idb[b]]);
std::swap(idb[a], idb[b]);
} else {
int a;
std::cin >> a;
-- a;
std::cout << idc[ida[a]] + 1 << "\n";
}
}
}
E - Flip Edge
题意:给你一个有向图,你可以花1的代价按边走,或者花费
存一个原图和反图,然后记
然后就可以
点击查看代码
void solve() {
int n, m, x;
std::cin >> n >> m >> x;
std::vector adj(2, std::vector(n, std::vector<int>{}));
for (int i = 0; i < m; ++ i) {
int u, v;
std::cin >> u >> v;
-- u, -- v;
adj[0][u].push_back(v);
adj[1][v].push_back(u);
}
const i64 inf = 1e18;
std::vector dist(n, std::array<i64, 2>{inf, inf});
using A = std::array<i64, 3>;
std::priority_queue<A, std::vector<A>, std::greater<A>> heap;
dist[0][0] = 0;
heap.push({dist[0][0], 0, 0});
while (heap.size()) {
auto [d, u, t] = heap.top(); heap.pop();
if (d != dist[u][t]) {
continue;
}
for (auto & v : adj[t][u]) {
if (dist[v][t] > dist[u][t] + 1) {
dist[v][t] = dist[u][t] + 1;
heap.push({dist[v][t], v, t});
}
}
for (auto & v : adj[t ^ 1][u]) {
if (dist[v][t ^ 1] > dist[u][t] + x + 1) {
dist[v][t ^ 1] = dist[u][t] + x + 1;
heap.push({dist[v][t ^ 1], v, t ^ 1});
}
}
}
std::cout << std::min(dist[n - 1][0], dist[n - 1][1]) << "\n";
}
F - Smooth Occlusion
题意:给你两个数组
先考虑满足任意相邻的两个数相差不超过
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<i64> a(n), b(n);
i64 sum = 0;
for (int i = 0; i < n; ++ i) {
std::cin >> a[i] >> b[i];
sum += a[i] + b[i];
}
for (int i = 1; i < n; ++ i) {
a[i] = std::min(a[i], a[i - 1] + m);
b[i] = std::min(b[i], b[i - 1] + m);
}
for (int i = n - 2; i >= 0; -- i) {
a[i] = std::min(a[i], a[i + 1] + m);
b[i] = std::min(b[i], b[i + 1] + m);
}
i64 min = 2e9;
for (int i = 0; i < n; ++ i) {
min = std::min(min, a[i] + b[i]);
}
std::cout << sum - n * min << "\n";
}
分类:
atcoder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】