Codeforces Round 923 (Div. 3)
Codeforces Round 923 (Div. 3)
A-Make it White
分析
在字符串中找到第一个B的位置l和最后一个B的位置r,打印r-l+1即可
如果找不到B打印-1
code
#include <bits/stdc++.h>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
typedef pair<int, int> PII;
const int N = 200008;
void solve() {
int n;
cin >> n;
string s;
cin >> s;
int l = -1, r = -1;
for (int i = 0; i < n; i++) {
if (s[i] == 'B') {
l = i;
break;
}
}
for (int i = n - 1; i >= 0; i--) {
if (s[i] == 'B') {
r = i;
break;
}
}
if (l == -1) {
cout << 0 << '\n';
} else {
cout << r - l + 1 << '\n';
}
}
signed main () {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
int t;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}
B-Following the String
分析
根据数组中的数,然后根据a-z从头到尾来构建该字符串.每次构建新字符的时候从前面已经构造完成的字符频率表中去查.
code
#include <bits/stdc++.h>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
typedef pair<int, int> PII;
const int N = 200008;
int a[N];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int st[30] = {0};
int idx = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == 0) {
cout << (char)(idx + 'a');
st[idx]++;
idx++;
} else {
for (int j = 0; j < 26; j++) {
if (st[j] == a[i]) {
cout << (char)(j + 'a');
st[j]++;
break;
}
}
}
}
cout << '\n';
}
signed main () {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
int t;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}
C-Choose the Different Ones!
分析
看数据范围ai<=1e6,所以我们可以构造一个数组来存储每个数字出现的频率.
构造频率数组st1和st2,如果当前的数大于k的话直接舍弃.
然后我们遍历根据频率数组st1和st2,如果某个数字两个数组都没有,肯定构造不出来.打印NO.之后
记录数字只存在于st1而不存在于st2的个数为a.记录数字只存在于st2而不存在于st1的个数为b.
当a<=2/k并且b<=2/k的时候说明可以构造出来打印YES否则打印NO
code
#include <bits/stdc++.h>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
typedef pair<int, int> PII;
const int N = 200008;
int a[N];
int b[N];
void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<int> st1(k + 3);
vector<int> st2(k + 3);
int x;
for (int i = 1; i <= n; i++) {
cin >> x;
if (x > k) {
continue;
} else {
st1[x]++;
}
}
for (int i = 1; i <= m; i++) {
cin >> x;
if (x > k) {
continue;
} else {
st2[x]++;
}
}
int a = 0;
int b = 0;
bool flag = true;
for (int i = 1; i <= k; i++) {
if (st1[i] == 0 && st2[i] == 0) {
flag = false;
break;
} else {
if (st1[i] >= 1 && st2[i] == 0) {
a++;
}
if (st2[i] >= 1 && st1[i] == 0) {
b++;
}
}
}
if (flag == false) {
no;
return;
}
if (a <= k / 2 && b <= k / 2) {
flag = true;
} else {
flag = false;
}
if (flag) {
yes;
} else {
no;
}
}
signed main () {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
int t;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}
D-Find the Different Ones!
分析
如果数组中两个数字不同就将这两个不同数字的下标记录下来.放入l数组和r数组中
对于每次询问a,b.使用b来二分r数组,找到第一个大于等于b在r数组中的位置.如果找不到就打印-1 -1.如果可以找到就去判断r数组下标对于的l数组的位置如果此时的a<=l[idx]说明要查找的a b中包含一种拥有一对不同下标的数组打印YES.若a>l[idx]的话,打印NO.
#include <bits/stdc++.h>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
typedef pair<int, int> PII;
const int N = 200008;
int a[N];
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
vector<int> l;
vector<int>r;
for (int i = 2; i <= n; i++) {
if (a[i] != a[i - 1]) {
l.push_back(i - 1);
r.push_back(i);
}
}
int q;
cin >> q;
while (q--) {
int a, b;
cin >> a >> b;
auto it = upper_bound(r.begin(), r.end(), b);
//查找第1个大于b的元素的地址
if (it == r.begin()) {
cout << -1 << ' ' << -1 << '\n';
continue;
}
it--;
int idx = it - r.begin();
if (a <= l[idx]) {
cout << l[idx] << ' ' << *it << '\n';
} else {
cout << -1 << ' ' << -1 << '\n';
}
}
cout << '\n';
}
signed main () {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
int t = 1;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}