Codeforces Round #956 (Div. 2) and ByteRace 2024 A-C题解

A. Array Divisibility

#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 2e5 + 7 ;
inline ll read(){
	ll x = 0 , f = 1 ;
	char c = getchar() ;
	while(c > '9' || c < '0'){
		if(c == '-')
			f = -1;
		c = getchar() ;
	}
	while(c >= '0' && c <= '9'){
		x = x * 10 + c - '0' ;
		c = getchar() ;
	}
	return x * f ;
}
ll  a[maxn] , t , n , m , k , l , r  , cnt = 0 , b[maxn] ;
char s[maxn] , S[maxn] ;
void solve(){
	n = read() ;
	for(int i = 1 ; i <= n ; i ++){
		cout << i << " " ;
	}
	cout << endl ;
}
int main(){
	t = read() ;
	while(t --){
		solve() ;
	}
	return 0 ;
}

B. Corner Twist

题意:给你一个n*n矩阵,只包含1,2,3三个数字,可以选择一个一个矩形,将一个对角线同时加一,另一个对角线同时加2,将答案mod3,问能否将a数组变成b数组?
题解:直接枚举,添加数字,最后和b比较即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 2e5 + 7 ;
inline ll read(){
	ll x = 0 , f = 1 ;
	char c = getchar() ;
	while(c > '9' || c < '0'){
		if(c == '-')
			f = -1;
		c = getchar() ;
	}
	while(c >= '0' && c <= '9'){
		x = x * 10 + c - '0' ;
		c = getchar() ;
	}
	return x * f ;
}
ll  a[1000][1000] , t , n , m , b[1000][1000] ; ;
char s[maxn] , S[maxn] ;
void solve(){
	n = read() ;
	m = read() ;
	for(int i = 1 ; i <= n ; i ++){
		scanf("%s" , s + 1) ;
		for(int j = 1 ; j <= m ; j ++){
			a[i][j] = s[j] - '0' ;
		}
	}
	for(int i = 1 ; i <= n ; i ++){
		scanf("%s" , s + 1) ;
		for(int j = 1 ; j <= m ; j ++){
			b[i][j] = s[j] - '0' ;
		}
	}
	for(int i = 1 ; i <= n - 1 ; i ++){
		for(int j = 1 ; j <= m - 1 ; j ++){
			if(a[i][j] != b[i][j]){
				ll cnt = (b[i][j] + 3 - a[i][j]) % 3 ;
				ll sum = 3 - cnt ;
				a[i][j] += cnt ;
				a[i][j] %= 3 ;
				a[i + 1][j + 1] += cnt ;
				a[i + 1][j +1] %= 3 ;
				a[i][j + 1] += sum ;
				a[i][j +1] %= 3 ;
				a[i + 1][j] += sum ;
				a[i + 1][j] %= 3 ;
			}
		}
	}
	bool f = 0 ;
	for(int i = 1 ; i <= n ; i ++){
		for(int j = 1 ; j <= m ; j ++){
//			cout << a[i][j] ;
			if(a[i][j] != b[i][j]){
				f = 1 ;
			}
		}
//		cout << endl ;
	}
	if(f == 1){
		cout << "NO\n" ;
		return ;
	}
	cout << "YES\n" ;
}
int main(){
	t = read() ;
	while(t --){
		solve() ;
	}
	return 0 ;
}

C. Have Your Cake and Eat It Too

题意:给你三个数组a,b,c,每个数组的和为tot,问能否找到三个[l,r]区间(a,b,c),三个区间不相交,使得每个区间和都大于tot/3上取整。
题解:直接枚举abc三个顺序即可,一共有六种不同的组合,然后用二分来找到答案,记录即可。复杂度很低。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 2e6 + 7 ;
inline ll read(){
	ll x = 0 , f = 1 ;
	char c = getchar() ;
	while(c > '9' || c < '0'){
		if(c == '-')
			f = -1;
		c = getchar() ;
	}
	while(c >= '0' && c <= '9'){
		x = x * 10 + c - '0' ;
		c = getchar() ;
	}
	return x * f ;
}
ll sa[maxn] , sb[maxn] , sc[maxn] ;
ll  a[maxn] , t , n , m , k , l , r  , b[maxn] , c[maxn] , d[maxn] , cnt = 6 ;
char s[maxn] , S[maxn] ;
void solve(){
	n = read() ;
	for(int i = 1 ; i <= n ; i ++){
		a[i] = read() ;
	}
	for(int i = 1 ; i <= n ; i ++){
		b[i] = read() ;
	}
	for(int i = 1 ; i <= n ; i ++){
		c[i] = read() ;
	}
	for(int i = 1 ; i <= n ; i ++){
		sa[i] = sa[i - 1] + a[i] ;
		sb[i] = sb[i - 1] + b[i] ;
		sc[i] = sc[i - 1] + c[i] ;
	}
//	cout << sa[n] << endl ;
	ll K = (sa[n] + 3 - 1) / 3 ;
//	cout << K<< endl ;
	while(1){
		ll rt = 1 ;
		ll l = 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sa[mid] - sa[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				ans = mid ;
				r = mid - 1 ;
			}
		}
//		cout << ans << " " ;
		d[1] = 1 ;
		d[2] = ans ;
		if(ans == -1){
			break ;
		}	
		rt = ans + 1 ;
		l = ans + 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sb[mid] - sb[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				r = mid - 1 ;
				ans = mid ;
			}
		}
//		cout << ans << endl ;
		d[3] = rt ;	
		d[4] = ans ;
		if(ans == -1){
			break ;
		}
		rt = ans + 1 ;
		ll sum = 0 ;
		sum += sc[n] - sc[rt - 1] ;
//		cout << sum << endl ;
		if(sum < K){
			break ;
		}
		else{
			d[5] = rt ;
			d[6] = n ;
			for(int i = 1 ; i <= cnt ; i ++){
				cout << d[i] << " " ;
			}
			cout << endl ;
			return ;
		}
	}
	while(1){
		ll rt = 1 ;
		ll l = 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sa[mid] - sa[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				ans = mid ;
				r = mid - 1 ;
			}
		}
		d[1] = 1 ;
		d[2] = ans ;
		if(ans == -1){
			break ;
		}	
		rt = ans + 1 ;
		l = ans + 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sc[mid] - sc[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				r = mid - 1 ;
				ans = mid ;
			}
		}
		d[5] = rt ;
		d[6] = ans ;
		if(ans == -1){
			break ;
		}
		rt = ans + 1 ;
		ll sum = 0 ;
		sum += sb[n] - sb[rt - 1] ;
		if(sum < K){
			break ;
		}
		else{
			d[3] = rt ;
			d[4] = n ;
			for(int i = 1 ; i <= cnt ; i ++){
				cout << d[i] << " " ;
			}
			cout << endl ;
			return ;
		}
	}
	while(1){
		ll rt = 1 ;
		ll l = 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sb[mid] - sb[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				ans = mid ;
				r = mid - 1 ;
			}
		}
		d[3] = 1 ;
		d[4] = ans ;
		if(ans == -1){
			break ;
		}	
		rt = ans + 1 ;
		l = ans + 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sa[mid] - sa[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				r = mid - 1 ;
				ans = mid ;
			}
		}
		d[1] = rt ;
		d[2] = ans ;
		if(ans == -1){
			break ;
		}
		rt = ans + 1 ;
		ll sum = 0 ;
		sum += sc[n] - sc[rt - 1] ;
		if(sum < K){
			break ;
		}
		else{
			d[5] = rt ;
			d[6] = n ;
			for(int i = 1 ; i <= cnt ; i ++){
				cout << d[i] << " " ;
			}
			cout << endl ;
			return ;
		}
	}
	while(1){
		ll rt = 1 ;
		ll l = 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sb[mid] - sb[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				ans = mid ;
				r = mid - 1 ;
			}
		}
		d[3] = 1 ;
		d[4] = ans ;
		if(ans == -1){
			break ;
		}	
		rt = ans + 1 ;
		l = ans + 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sc[mid] - sc[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				r = mid - 1 ;
				ans = mid ;
			}
		}
		d[5] = rt ;
		d[6] = ans ;
		if(ans == -1){
			break ;
		}
		rt = ans + 1 ;
		ll sum = 0 ;
		sum += sa[n] - sa[rt - 1] ;
		if(sum < K){
			break ;
		}
		else{
			d[1] = rt ;
			d[2] = n ;
			for(int i = 1 ; i <= cnt ; i ++){
				cout << d[i] << " " ;
			}
			cout << endl ;
			return ;
		}
	}
	while(1){
		ll rt = 1 ;
		ll l = 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sc[mid] - sc[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				ans = mid ;
				r = mid - 1 ;
			}
		}
		d[5] = 1 ;
		d[6] = ans ;
		if(ans == -1){
			break ;
		}	
		rt = ans + 1 ;
		l = ans + 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sa[mid] - sa[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				r = mid - 1 ;
				ans = mid ;
			}
		}
		d[1] = rt ;
		d[2] = ans ;
		if(ans == -1){
			break ;
		}
		rt = ans + 1 ;
		ll sum = 0 ;
		sum += sb[n] - sb[rt - 1] ;
		if(sum < K){
			break ;
		}
		else{
			d[3] = rt ;
			d[4] = n ;
			for(int i = 1 ; i <= cnt ; i ++){
				cout << d[i] << " " ;
			}
			cout << endl ;
			return ;
		}
	}
	while(1){
		ll rt = 1 ;
		ll l = 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sc[mid] - sc[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				ans = mid ;
				r = mid - 1 ;
			}
		}
		d[5] = 1;
		d[6] = ans ;
		if(ans == -1){
			break ;
		}	
		rt = ans + 1 ;
		l = ans + 1 , r = n , ans = -1 ;
		while(l <= r){
			ll mid = (l + r) / 2 ;
			if(sb[mid] - sb[rt - 1] < K){
				l = mid + 1 ;
			}
			else{
				r = mid - 1 ;
				ans = mid ;
			}
		}
		d[3] = rt ;
		d[4] = ans ;
		if(ans == -1){
			break ;
		}
		rt = ans + 1 ;
		ll sum = 0 ;
		sum += sa[n] - sa[rt - 1] ;
		if(sum < K){
			break ;
		}
		else{
			d[1] = rt ;
			d[2] = n ;
			for(int i = 1 ; i <= cnt ; i ++){
				cout << d[i] << " " ;
			}
			cout << endl ;
			return ;
		}
	}
	cout << -1 << endl ;
}
int main(){
	t = read() ;
	while(t --){
		solve() ;
	}
	return 0 ;
}

喜欢作者的记得点赞收藏加关注哦~

相关推荐

  1. Codeforces Round #956 (Div. 2) and ByteRace 2024 A-C题解

    2024-07-12 21:12:05       24 阅读
  2. Codeforces Round 936 (Div. 2) (A~C)

    2024-07-12 21:12:05       39 阅读
  3. Codeforces Round 959(Div. 1 + Div. 2)A~C

    2024-07-12 21:12:05       22 阅读
  4. Codeforces Round 952 (Div. 4) c++题解(A-H1)

    2024-07-12 21:12:05       21 阅读
  5. codeforces round 936 div2(a,b,c)

    2024-07-12 21:12:05       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 21:12:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 21:12:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 21:12:05       57 阅读
  4. Python语言-面向对象

    2024-07-12 21:12:05       68 阅读

热门阅读

  1. 科技与狠活

    2024-07-12 21:12:05       19 阅读
  2. 大语言模型系列-Transformer

    2024-07-12 21:12:05       21 阅读
  3. Git-Updates were rejected 解决

    2024-07-12 21:12:05       20 阅读
  4. 推荐系统中的冷启动问题及其解决方案

    2024-07-12 21:12:05       18 阅读
  5. vue在线预览excel、pdf、word文件

    2024-07-12 21:12:05       24 阅读
  6. 解决el-table表格没有横向滚动条

    2024-07-12 21:12:05       22 阅读
  7. PyTorch 1-深度学习

    2024-07-12 21:12:05       20 阅读
  8. pip install selenium异常

    2024-07-12 21:12:05       19 阅读
  9. PostgreSQL 导入 .gz 备份文件

    2024-07-12 21:12:05       18 阅读