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;
}
posted @ 2024-02-07 23:21  harper886  阅读(27)  评论(0编辑  收藏  举报