Codeforces Round 784 (Div. 4)
儒烏風亭いおり

A. Division?

条件判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
void solve() {
int x;
std::cin >> x;
if(x <= 1399) {
std::cout << "Division 4\n";
}
else if(x <= 1599) {
std::cout << "Division 3\n";
}
else if(x <= 1899) {
std::cout << "Division 2\n";
}
else std::cout << "Division 1\n";
}
int main() {
}

B. Triple

判断有没有一个数字出现至少三次

最优时间复杂度为 ,使用一个桶,加一个数字就判断桶里有几个

有点懒,直接 sort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for(int i = 0; i < n; i++)
std::cin >> a[i];
sort(a.begin(), a.end());
for(int i = 1; i + 1 < n; i++)
if(a[i - 1] == a[i] && a[i] == a[i + 1]) {
std::cout << a[i] << '\n';
return ;
}
std::cout << -1 << '\n';
}
int main() {
}

C. Odd/Even Increments

判断能否通过一些操作让所有数字奇偶性相同

因为操作只能让奇数位置或偶数位置的奇偶性都改变

直接判断奇数位置或偶数位置有没有奇数偶数同时存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<bits/stdc++.h>
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for(int i = 0; i < n; i++)
std::cin >> a[i];
bool flaga = false,flagb = false;
for(int i = 0; i < n; i += 2) {
if(a[i] & 1) flaga = true;
else flagb = true;
}
if(flaga && flagb) {
std::cout << "NO" << '\n';
return;
}

flaga = false;
flagb = false;
for(int i = 1; i < n; i += 2) {
if(a[i] & 1) flaga = true;
else flagb = true;
}
if(flaga && flagb) {
std::cout << "NO" << '\n';
return;
}
std::cout << "YES" << '\n';
}
int main() {
}

D. Colorful Stamp

为分割点,对每一段分别判断

开始以为是判断边界两个点不同色,后面发现只要存在相邻位置不同色就有解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
bool check(std::string s) {
int len = s.length();
if(len == 0) return true;
if(len == 1) return false;
for(int i = 1; i < len; i++)
if(s[i - 1] != s[i])
return true;
return false;
}
void solve() {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
int pos = 0, len = 0;
while(pos < n) {
while(pos + len < n && s[pos + len] != 'W')
len ++;

bool flag = check(s.substr(pos,len));
if(flag == false) {
std::cout << "NO\n";
return;
}
pos = pos + len + 1;
len = 0;
}
std::cout << "YES\n";
}
int main() {
}

E. 2-Letter Strings

简单统计一下,注意开 long long

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>
void solve() {
int n;
std::cin >> n;
long long ans = 0;
std::vector<std::vector<int>> a(26,std::vector<int> (27)),b(26,std::vector<int> (27));
for(int i = 0; i < n; i++) {
std::string s;
std::cin >> s;
int x,y;
x = s[0] - 'a';
y = s[1] - 'a';
a[x][0]++;a[x][y + 1]++;
ans += a[x][0] - a[x][y + 1];
b[y][0]++;b[y][x + 1]++;
ans += b[y][0] - b[y][x + 1];
}
std::cout << ans << '\n';
}
int main() {
}

F. Eating Candies

在给定序列中找到一个前缀和后缀,让他们的值相等,且长度和最大

发现前缀和单调递增,考虑用二分的方法

枚举后缀,二分前缀,判断,刷新答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n + 1);
std::map<long long,int> map;
std::vector<long long> prefix(n + 1);
for(int i = 1; i <= n; i++) {
std::cin >> a[i];
prefix[i] = prefix[i - 1] + a[i];
map[prefix[i]] = i;
}
int ans = 0;
for(int i = n - 1; i >= 1; i--) {
long long val = *lower_bound(prefix.begin() + 1,prefix.end(),
prefix[n] - prefix[i]);
if(val != prefix[n] - prefix[i]) continue;
int pos = map[val];
if(pos > i) continue;
ans = std::max(ans,pos + n - i);
}
std::cout << ans << '\n';
}
int main() {
}

G. Fall Down

简单模拟题,有点担心 1e7 爆时间复杂度,优化了一下下落位置,复杂度 1e6 级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
void solve() {
int n,m;
std::cin >> n >> m;
std::vector<std::string> s(n + 1);
for(int i = 1; i <= n; i++) {
std::cin >> s[i];
}
for(int i = 0; i < m; i++) {
int las = n;
for(int j = n; j >= 1; j--) {
if(s[j][i] == 'o') las = j - 1;
if(s[j][i] == '*') {
std::swap(s[j][i],s[las][i]);
las--;
}
}
}
for(int i = 1; i <= n; i++) {
std::cout << s[i] << '\n';
}
}
int main() {
}

H. Maximal AND

简单贪心,从高位到低位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<bits/stdc++.h>
void solve() {
int n,k;
std::cin >> n >> k;
std::vector<int> s(31);
for(int i = 0; i < n; i++) {
int x;
std::cin >> x;
for(int j = 0; j <= 30; j++)
if(x & (1 << j))
s[j]++;
}
int ans = 0;
for(int i = 30; i >= 0; i--) {
if(s[i] + k >= n) {
ans += (1 << i);
k = k - (n - s[i]);
}
}
std::cout << ans << '\n';
}
int main() {
}

总结 & 吐槽

参与,一个小时 挺爽的,虽然大佬们都是二十分钟

为什么 不加分啊(恼