Codeforces Round #706 (Div. 2)
Codeforces Round #706 (Div. 2)
A - Split it!
有点像回文
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> m >> s + 1; k = 0;
rep (i, 1, n >> 1) if (s[i] == s[n + 1 - i]) ++k; else break;
if (m * 2 == n) { cout << "NO\n"; continue; }
if (k >= m) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
B - Max and Mex
如果 Mex > n - 1, 每次都会插入新值, 否则只能插入一次
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> m; set<int> st; int k = 0;
rep (i, 1, n) cin >> cas, st.insert(cas);
for (auto &i : st) {
if (i == k) ++k;
else break;
}
if (k == n) { cout << n + m << '\n'; continue; }
if (m) st.insert(k + *st.rbegin() + 1 >> 1);
cout << st.size() << '\n';
}
return 0;
}
C - Diamond Miner
贪心, 大的和大的在一起开根号 损失的更多
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n; int x = 0, y = 0;
rep (i, 1, n << 1) {
cin >> a[0].fi >> a[0].se;
if (a[0].se) a[++x].se = abs(a[0].se);
else b[++y].fi = abs(a[0].fi);
}
sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + n);
double ans = 0;
rep (i, 1, n) ans += sqrt(sqr(a[i].se) + sqr(b[i].fi));
cout << precision(15) << ans << '\n';
}
return 0;
}
D - Let's Go Hiking
注意到 只能有一条最长链, 否则先手站一条, 后手站一条, 先手必输
其次, 只有一条最长链, 先手和后手都会选在最长链上, 否则谁不在, 另一方直接获胜
在其 先手会在山峰, 否则后手直接卡死
故先手会选择在 最长链的最高端, 后手会选择最长链最远的地方, 保证和先手相隔 偶数个位置(保证两者都走最长链, 后手胜)
后手保证了先手最长链一定会输, 只能走最长链的反方向, 比较先手和后手能走的长度, 判断是否能先手赢
void work(int x, int y) {
int c = (x - 1) & 1 ? x - 2 : x - 1;
if (1 + c >= y) cout << 0;
else cout << 1;
}
int main() {
IOS; cin >> n; a[0] = a[n + 1] = N;
rep (i, 1, n) {
cin >> a[i], b[i] = a[i] > a[i - 1] ? b[i - 1] + 1 : 0;
if (umax(m, b[i])) cnt = 1, w = i;
else if (m == b[i]) ++cnt;
}
per (i, n, 1) {
c[i] = a[i] > a[i + 1] ? c[i + 1] + 1 : 0;
if (umax(m, c[i])) cnt = 1, w = i;
else if (m == c[i] && w != i) ++cnt;
}
if (cnt > 1) return cout << 0, 0;
if (b[w] == m) work(b[w], c[w]);
else work(c[w], b[w]);
return 0;
}