首页 > 其他分享 >Codeforces Round 923 (Div. 3)

Codeforces Round 923 (Div. 3)

时间:2024-02-07 23:34:11浏览次数:42  
标签:数组 int Codeforces long solve st2 Div 923 define

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;
}

标签:数组,int,Codeforces,long,solve,st2,Div,923,define
From: https://www.cnblogs.com/harper886/p/18011474

相关文章

  • Codeforces Round 921 (Div. 2)
    https://codeforces.com/contest/1925恶心round,从C题开始每题都是一眼看出做法但是细节挺多的题,烦的一比。A.WeGotEverythingCovered!*800给定\(n,k\),若所有长度为\(n\)且仅由字母表中前\(k\)个小写字母组成的串都是\(s\)的子序列,则称\(s\)是"EverythingCover......
  • Codeforces Round 923 (Div. 3)(A~F)
    目录ABCDEFA#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definepllpair<longlong,longlong>#de......
  • Codeforces-Hello-2024-Round
    比赛链接A.WalletExchange签到,某个人操作的时候只要一方有金币就行,所以最终赢的应该是拿到最后一个硬币的人,当\(a+b\equiv1\pmod2\)的时候Alice获胜,否则Bob获胜。时间复杂度\(\mathcal{O}(1)\)。codeforA#include<bits/stdc++.h>usingnamespacestd;inli......
  • CF1401E Divide Square 题解
    解题思路其实多看几组也能发现块数等于交点的数量加上两个端点都在边上的线段数量再加一。证明如下(图见样例):对于两条只有一个端点位于边上的线段,因为保证有一个端点位于边上,那么这两条线段的交点一定会和已存在的点、边构成一个新的矩形;对于其中有一条为两个端点均位于边上的......
  • Codeforces Round 920 (Div. 3)(A~F)
    目录ABCDEFA按题意模拟即可#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definepllpair<longlong,longlong......
  • Codeforces div2 C题补题
    Codeforcesdiv2C题补题1922C.ClosestCitiesC.ClosestCities很容易看出,端点的两个城市的最近城市就是他的直接后继和直接前驱,而中间的城市的最近城市就是他前驱和后继中距离绝对值最小的那个,因此我们可以先预处理出每个城市对应的最近城市,用map存储。然后因为区间可以从......
  • 从BigDecimal的divide的异常说起
    在过去做项目的某一天中,突然有小伙伴说两个BigDecimal的数据相除(divide)报错了,觉得不可能,然后问他是怎么编写的,他说很简单呀,就是new了2个BigDecimal,然后相除的结果赋值给另外一个BigDecimal对象。听起来觉得没有问题,正常来说,2个Integer(int),2个Double(double)都不会报错,然后问是什么......
  • Codeforces Round 913 (Div. 3) G.
    题目链接G.把灯看成节点,灯之间的关系看成有向边得到基环树森林若节点的入度为0,那么它一定要用一次开关,这是可以确定的所以用拓扑,把这些确定贡献的节点删去然后就剩下了若干个环若环上有奇数个权值为1的节点,那么不可能全部关上对于环上一个打开的灯,它要么直接用自己的开关......
  • Codeforces Round 921 (Div. 1) 题解
    HelloAd-HocForces!A字符集为前\(k\)个小写字母,给定长度为\(m\)的字符串,求所有的长度为\(n\)的字符串是否是这个字符串的子串。(此处字串不连续)如果不是需要给出反例。\(1\len,k\le26\),\(1\lem\le1000\)。\(\sumn,\summ\le10^6\)sol.D1A就是神秘贪心,汗流浃背......
  • Codeforces Round 917 (Div. 2)
    https://codeforces.com/contest/1917A.LeastProduct*800给定整数数组,可以把数组中的数\(a_i\)改为\(0\sima_i\)中的任意整数,最小化所有数的乘积,在此基础上使操作次数最少讨论一下负数的个数和\(0\)的个数#include<bits/stdc++.h>usingnamespacestd;usingll......