
codeforces 706 div2题解
发布日期:2021-05-10 04:58:51
浏览次数:25
分类:精选文章
本文共 4797 字,大约阅读时间需要 15 分钟。
A Split it!
思路:
将字符串反转后,检查前k个字符是否与原字符串的前k个字符相等,并满足k*2+1 ≤ n的条件。代码:
#include#include #include using namespace std;const int maxn = 200005;const int base = 131;int main() { // 读取输入 int t, n, k; string s, s1; while (--t >= 0) { cin >> n >> k >> s; s1 = s; reverse(s.begin(), s.end()); int cnt = 0; bool flag = false; for (int i = 0; i < n; ++i) { if (s[i] != s1[i]) { if (cnt >= k) flag = true; break; } ++cnt; if (cnt >= k) { flag = true; break; } } if (k == 0 || (flag && (k*2+1 <= n))) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0;}
B Max and Mex
思路:
如果b不在序列中且序列不是连续的,则mex < max,b的最小值为 (mex + mex + 1 + 1)/2。如果b不在序列中且序列是连续的,则mex > max,b的最小值为 (max + max + 1 + 1)/2。代码:
#include#include #include using namespace std;const int maxn = 200005;const int base = 131;int main() { int t, n, k; string s, s1; while (--t >= 0) { cin >> n >> k; set vis; vector a(n); for (int i = 1; i <= n; ++i) { cin >> a[i]; vis.insert(a[i]); } sort(a.begin(), a.end()); int bb = a.back(); int cnt = 0; bool found = false; for (int i = 1; i <= n; ++i) { if (a[i] == bb) { ++cnt; if (cnt > 1) break; } else { ++cnt; if (cnt > 1) break; } } if (k == 0) { cout << vis.size() << endl; continue; } if (found) { int b = (a[i-1] + a[i] + 1 + 1) / 2; cout << b << endl; } else { int b = (a[i-1] + a[i] + 1 + 1) / 2; cout << b << endl; } } return 0;}
C Diamond Miner
思路:
将所有点映射到第一象限,计算每个点与其对应点的最小距离。代码:
#include#include #include using namespace std;const int maxn = 200005;const int base = 131;int main() { int t, n, k; while (--t >= 0) { cin >> n; vector x(n), y(n); for (int i = 0; i < n; ++i) { cin >> x[i] >> y[i]; } vector a(n), b(n); for (int i = 0; i < n; ++i) { if (x[i] == 0) { a[i] = y[i] > 0 ? y[i] : -y[i]; } else { a[i] = x[i] > 0 ? x[i] : -x[i]; } } sort(a.begin(), a.end()); sort(b.begin(), b.end()); double ans = 0.0; for (int i = 0; i < n; ++i) { ans += sqrt(a[i] * a[i] + b[i] * b[i]); } cout << fixed << setprecision(15) << ans << endl; } return 0;}
D Let's Go Hiking
思路:
找到最长单调递增或递减子序列的长度。如果长度为奇数,先手方必输;如果长度为偶数,后手方必输。代码:
#include#include #include using namespace std;const int maxn = 200005;const int base = 131;int main() { int n; cin >> n; vector p(n); for (int i = 0; i < n; ++i) { cin >> p[i]; } vector l(n), r(n); l[0] = 1; r[n-1] = 1; for (int i = 1; i < n; ++i) { l[i] = (p[i] > p[i-1]) ? l[i-1] + 1 : 1; } for (int i = n-2; i >= 0; --i) { r[i] = (p[i] > p[i+1]) ? r[i+1] + 1 : 1; } int max_len = 0, start = 0; for (int i = 0; i < n; ++i) { if (l[i] > max_len || r[i] > max_len) { max_len = max(l[i], r[i]); start = i; } else if (l[i] == max_len || r[i] == max_len) { max_len = 0; } } int mx = (l[start] > r[start]) ? l[start] : r[start]; int mi = (l[start] > r[start]) ? r[start] : l[start]; int ans = (mx % 2) ? 1 : 0; cout << ans << endl;}
E Garden of the Sun
思路:
每三行清空中间一行,保持其他行的连通性。代码:
#include#include #include using namespace std;const int maxn = 60005;const int base = 131;int main() { int t, n, m; while (--t >= 0) { cin >> n >> m; vector g(n); for (int i = 0; i < n; ++i) { g[i].clear(); cin >> g[i]; } for (int i = (n % 3 == 0) ? 1 : 0; i < n; i += 3) { for (int j = 0; j < m; ++j) { g[i][j] = 'X'; } if (i > 0 && (m == 1 || (g[i-1][1] != 'X' || g[i-2][1] != 'X'))) { g[i-1][1] = 'X'; g[i-2][1] = 'X'; } } for (int i = 0; i < n; ++i) { cout << g[i] << endl; } }}
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月12日 16时36分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[PHP] error_reporting(0)可以屏蔽Fatal error错误
2019-03-15
[PHP] 解决php中上传大文件的错误
2019-03-15
[Git] 彻底删除github上的某个文件以及他的提交历史
2019-03-15
[Go] gin框架渲染html字符串
2019-03-15
[操作系统]内存连续分配管理方式
2019-03-15
[Go] json.Unmarshal()解析后存储的结构体定义
2019-03-15
scala Tuple入门到熟悉
2019-03-15
superset报错
2019-03-15
C++ Primer Plus【复习笔记】-【复合类型】
2019-03-15
使用Spring AOP应该注意的一个小细节
2019-03-15
2020-08-26
2019-03-15
shell脚本一键删除php7.4.8
2019-03-15
Tomcat内存溢出解决方案
2019-03-15
上传按钮的设计
2019-03-15
thinkphp 的一些重要知识点
2019-03-15
Python基础案例教程
2019-03-15
Java学习第二章——Java基本语句
2019-03-15
Creator 2.0.9 去掉fps显示
2019-03-15