代码写的最丑陋的一集
A. Doremy’s Paint 3
由题可知在 b b b 中出现的数字只能有两个,且这两个数字的数量的差的绝对值不能大于 1 1 1
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl
#define debugList(list) \
std::cerr << "\033[34m" << #list << ": ["; \
for (auto& e : list) { \
std::cerr << e << ", "; \
} \
std::cerr << "\b\b]\033[0m" << endl
void solve(int cs) {
int n;
cin >> n;
set<int> s;
map<int, int> mp;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
s.insert(x);
mp[x]++;
}
if (s.size() > 2) {
cout << "NO\n";
return;
}
else if (s.size() == 1) {
cout << "YES\n";
return;
}
else {
int cnt[2];
int i = 0;
for (auto p : s) {
cnt[i] = mp[p];
i++;
}
if (abs(cnt[0] - cnt[1]) > 1) {
cout << "NO\n";
return;
}
else {
cout << "YES\n";
return;
}
}
}
signed main() {
IO;
int T, TT = 1;
T = 1;
cin >> T;
while (T--) {
solve(TT++);
}
return 0;
}
B. Qingshan Loves Strings
讨论题
想要构造出一个 good string
要满足以下条件:
- t t t 必须 01 01 01 交错且首位必须相同
- s s s 中若出现 s i = s i + 1 s_i = s_{i+1} si=si+1 的情况, s i s_i si 必须和 t 0 t_0 t0 不同,且所有的 s i = s i + 1 s_i = s_{i+1} si=si+1 的 s i s_i si 必须全部相同
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl
#define debugList(list) \
std::cerr << "\033[34m" << #list << ": ["; \
for (auto& e : list) { \
std::cerr << e << ", "; \
} \
std::cerr << "\b\b]\033[0m" << endl
void solve(int cs) {
int n, m;
cin >> n >> m;
string s, t;
cin >> s >> t;
int f = 1;
set<int> st;
rep (i, 1, n - 1) {
if (s[i] == s[i - 1]) {
f = 0;
st.insert(s[i - 1] - '0');
}
}
if (f) {
cout << "YES\n";
return;
}
f = 0;
rep (i, 1, m - 1) {
if (t[i] == t[i - 1]) {
f = 1;
}
}
if (f || t[0] != t[m - 1] || st.size() > 1) {
cout << "NO\n";
return;
}
if (*st.rbegin() != (t[0] - '0')) {
cout << "YES\n";
}
else {
cout << "NO\n";
}
}
signed main() {
IO;
int T, TT = 1;
T = 1;
cin >> T;
while (T--) {
solve(TT++);
}
return 0;
}
C. Qingshan Loves Strings 2
首先特判掉必不成立的情况:
- n n n 为奇数
- s s s 中 01 01 01 个数必须相同
然后双指针扫描 s s s :
- 当 $s[l] == s[r] $ 且 s [ l ] = ′ 0 ′ s[l] = '0' s[l]=′0′ 时,在 r + 1 r + 1 r+1 处插入 “ 01 01 01” ,记录答案,更新 r r r
- 当 $s[l] == s[r] $ 且 s [ l ] = ′ 1 ′ s[l] = '1' s[l]=′1′ 时,在 l l l 处插入 “ 01 01 01” ,记录答案,更新 r r r
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl
#define debugList(list) \
std::cerr << "\033[34m" << #list << ": ["; \
for (auto& e : list) { \
std::cerr << e << ", "; \
} \
std::cerr << "\b\b]\033[0m" << endl
void solve(int cs) {
int n;
cin >> n;
string s;
cin >> s;
if (n & 1) {cout << "-1\n"; return;} int c1 = count(s.begin(), s.end(), '1'); int c2 = n - c1; if (c1 != c2) {cout << "-1\n"; return;}
VI ans;
string t = "01";
int l = 0, r = n - 1;
while (l <= r) {
if (s[l] != s[r]) {l++; r--; continue;}
else {
if (s[l] == '0') {
s.insert(r + 1, t);
ans.pb(r + 1);
r += 2;
}
else {
s.insert(l, t);
ans.pb(l);
r += 2;
}
l++; r--;
}
}
print(ans.size());
for (auto p : ans) {
cout << p << " ";
}
cout << endl;
}
signed main() {
IO;
int T, TT = 1;
T = 1;
cin >> T;
while (T--) {
solve(TT++);
}
return 0;
}
D. Doremy’s Connecting Plan
贪心
本题必用1号点去连所有的点,令 s u m sum sum 表示 ∑ k ∈ S a k \sum\limits_{k \in S} a_k k∈S∑ak ,当 s u m + ( a i − i ∗ c ) ≥ 0 sum + (a_i-i*c) \ge 0 sum+(ai−i∗c)≥0 时即可连点
故我们将除 a 1 a_1 a1 以外的 a i − i ∗ c a_i-i*c ai−i∗c 加入到大根堆中,每次连堆顶的点即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
#define VI vector<int>
#define pii pair<int, int>
#define rep(i, j, k) for (int i = j; i <= k; ++i)
#define per(i, j, k) for (int i = j; i >= k; --i)
#define print(a) cout << a << endl;
const int inf = 0x3f3f3f3f;
const long long llinf = (long long)0x3f3f3f3f3f3f3f3f;
const long long MOD = (long long)1e9 + 7LL;
const size_t N = (size_t)1e6 + 5;
#define IO \
ios::sync_with_stdio(false); \
std::cin.tie(0); \
std::cout.tie(0)
#define debug(a) std::cerr << "\033[34m" << #a << ':' << a << "\033[0m" << endl
#define debugList(list) \
std::cerr << "\033[34m" << #list << ": ["; \
for (auto& e : list) { \
std::cerr << e << ", "; \
} \
std::cerr << "\b\b]\033[0m" << endl
struct cmp {
bool operator()(pii x, pii y) {
return x.first < y.first;
}
};
void solve(int cs) {
int n, c;
cin >> n >> c;
priority_queue<pii, vector<pii>, cmp> q;
int sum;
cin >> sum;
rep (i, 2, n) {
int x;
cin >> x;
q.push(make_pair(x - i * c, x));
}
while (!q.empty()) {
auto x = q.top();
if (x.first + sum >= 0) {
sum += x.second;
q.pop();
}
else {
cout << "NO\n";
return;
}
}
cout << "YES\n";
}
signed main() {
IO;
int T, TT = 1;
T = 1;
cin >> T;
while (T--) {
solve(TT++);
}
return 0;
}