Codeforces Round 943 (Div. 3) (A-G1) C++题解

目录

比赛链接 : 

A. Maximize?

B. Prefiquence

C. Assembly via Remainders

 D. Permutation Game

E. Cells Arrangement

F. Equal XOR Segments

G1. Division + LCP (easy version)

G2. Division + LCP (hard version)


比赛链接 : 

Dashboard - Codeforces Round 943 (Div. 3) - Codeforces

A. Maximize?

数据范围小,随便搞,遍历即可 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define lowbit(x) (x&(-x))
#define sz(a) (int)a.size()
#define pb push_back
#define all(a) a.begin(), a.end()
#define int long long
typedef long long LL;
const int mod = 1e9+7;
const int N = 2e5+10;
using namespace std;

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

inline void solve(){
	int x ; cin >> x ;
	int ans  = 0 ,res;
	for(int i=1;i<x;i++){
		int t = gcd(i,x) + i ;
		if(t>ans){
			ans = t ;
			res = i ;	
		}
	}
	cout << res << endl ;
}
 
signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while(_ --) solve();
    return 0;
}

B. Prefiquence

简单贪心,先设a的遍历下标l为0,在b中遇到一个b[i]==a[l],那么l++,ans++;

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define lowbit(x) (x&(-x))
#define sz(a) (int)a.size()
#define pb push_back
#define all(a) a.begin(), a.end()
#define int long long
typedef long long LL;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

using namespace std;

inline void solve() {
	int n , m ; cin >> n >> m ;
	string a , b ; cin >> a >> b ;
	int ans = 0 ;
	int l = 0 ;
	for(int i=0;i<m;i++){
		if(b[i]==a[l]){
			l ++ ;
			ans ++ ;
		}
	}
	cout << ans << endl ;
}

signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while (_--) solve();
    return 0;
}

C. Assembly via Remainders

只要满足a[1]>x[2]的任意一个值,然后后面递推即可 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define int long long
typedef long long LL;
const int mod = 1e9+7;
const int N = 2e5+10;

using namespace std;

inline void solve(){
	int n ; cin >> n ;
	vector<int> x(n+1) , a(n+1) ;
	for(int i=2;i<=n;i++) cin >> x[i] ;
	a[1] = 1001 ;
	for(int i=2;i<=n;i++) a[i] = a[i-1] + x[i] ;
	for(int i=1;i<=n;i++) cout << a[i] << " " ;
	cout << endl ;
}
 
signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while(_ --) solve();
    return 0;
}

 D. Permutation Game

首先我们可以先找到a数组的最大值ma ;

  • 如果BodYa和Sasha有可能能够到达ma的话,在k足够大的情况下,一定优先到达ma处,保存这一条路径上的a值 ;
  • 如果不能到达,也就是形成了一个死循环,也可以找出这一条路径的a值,遇到之前遍历过的店,就结束寻找 ,这里用set记录;
  • 路径上的a值分别保存在B和S数组中 ;

那么求出B和S数组的前缀和,分别保存在Bs,Ss数组中;

分别求出可能得到的最大分数 : 

  • 对于BodYa和Sasha两个人,都可以停留在之前获取路径上的任意一点,然后这点下标为i ;
  • 这里分数分两部分,1LL * (k-i) * S[i] 和 1LL * Ss[i],其中对BodYa也一样,遍历求出最大值即可;

.......................

表达能力有限,还是看代码吧,写的很清楚 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
typedef long long LL;
const int N = 2e5+10;
using namespace std;

int n , k , pb , ps ;
int p[N] , a[N]  , B[N] , S[N] ;
LL Bs[N] , Ss[N] ;

inline void solve(){
	cin >> n >> k >> pb >> ps ;
	int ma = 0 ;
	for(int i=1;i<=n;i++) cin >> p[i] ;
	for(int i=1;i<=n;i++) {
		cin >> a[i] ;
		if(a[i]>ma) ma = a[i] ;
	}
	int lb = 0 , ls = 0 ;
	set<int> stb , sts ;
	bool tb = false , ts = false ;
	
	while(a[pb]!=ma){
		if(stb.find(pb)!=stb.end()) {
			tb = true ;
			break ;
		}
		B[lb++] = a[pb] ;
		stb.insert(pb);
		pb = p[pb] ;
	}
	if(!tb) B[lb++] = ma ; 
	
	while(a[ps]!=ma){
		if(sts.find(ps)!=sts.end()){
			ts = true ;
			break ;
		}
		S[ls++] = a[ps] ;
		sts.insert(ps) ;
		ps=p[ps];
	}
	if(!ts) S[ls++] = ma ; 
	
	LL mb = 0 , ms = 0 ;// 记录最终分数 
	for(int i=0;i<lb;i++) Bs[i+1] = B[i] + Bs[i] ;
	for(int i=0;i<ls;i++) Ss[i+1] = S[i] + Ss[i] ;
	LL res = 0 ;
	for(int i=0;i<lb;i++){
		if(k>=i+1) res = 1LL * (k-i)*B[i] + 1LL * Bs[i] ;
		else break ;
		mb = max(mb , res) ;
	}
	res = 0 ;
	for(int i=0;i<ls;i++){
		if(k>=i+1) res = 1LL * (k-i) * S[i] + 1LL * Ss[i] ;
		else break ;
		ms = max(ms,res) ;
	}
	if(mb>ms) cout << "Bodya" << endl ;
	else if(mb==ms) cout << "Draw" << endl ;
	else cout << "Sasha" << endl ;
}
 
signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while(_ --) solve();
    return 0;
}

E. Cells Arrangement

这就是一个guess题,首先可能想到的是全按对角线排布,但是只能够获得全是偶数的H集合;

那么挑出一个(2,2)改为(1,2),就可以获得0,1,2,3,4,...2*(n-1)这么多,且这是最多的;

大概也就是这个样子 : 

 

代码 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define int long long
typedef long long LL;
const int mod = 1e9+7;
const int N = 2e5+10;

using namespace std;

inline void solve(){
	int n ; cin >> n ;
	cout << "1 1" << endl ;
	cout << "1 2" << endl ;
	for(int i=3;i<=n;i++) cout << i << " " << i << endl ;
	cout << endl ;
}
 
signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while(_ --) solve();
    return 0;
}

F. Equal XOR Segments

二分 + 位运算

首先要知道的一点是 : 异或(^)是具有前缀和性质的,我们用一个s数组来记录前缀异或和,但是这里a后面也没啥用,直接原地前缀和即可 

[注] : 要求[l,r]的异或 , 直接返回a[r] ^ a[l-1]即可 

如果a[r] ^ a[l-1] == 0,那么一定可以满足题目条件,因为[l,r]中一定存在l<m<r满足a[m]^a[l-1] == a[r]^a[m-1] == v ;

如果a[r]^a[l-1]!=0,设为v,那么如果要满足题目条件,k一定为奇数且一定可以找到三个异或和为v的区间(因为多出来的偶数个会互相抵消) : 

那么题目也就转换成[l,r]能划分为3个异或和为v的区间 : 

这里我们可以用map<int,vector<int>>存下每个前缀异或和的下标;

分两步 : 

1 . 找到最小的i>l使s[i]=s[r],找不到则无解

2 . 找到最小的j>i使s[j]=s[l-1]

如果i<j && j<r则输出yes,否则输出no;

详细请看代码 : 

 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define int long long
typedef long long LL;
const int mod = 1e9+7;
const int N = 2e5+10;
using namespace std;

//1
//5 1
//1 1 2 3 0
//1 5

int a[N] ;

inline void solve(){
	int n , q ; cin >> n >> q ;
	map<int,vector<int>> mp ;
	mp[0].push_back(0) ;
	for(int i=1;i<=n;i++) {
		cin >> a[i] ;
		a[i] ^= a[i-1] ;
		mp[a[i]].push_back(i) ;
	}
	while(q--){
		int l , r ; cin >> l >> r ;
		int x = a[r] ^ a[l-1] ;
		if(x==0) {cout << "YES" << endl ; continue ; }
		// v!=0 : k一定为奇数(k>=3),且一定能划3段异或和为v的区间
		// 1 . 找到最小的i>l使s[i]=s[r],找不到则无解
		auto i = lower_bound(mp[a[r]].begin(),mp[a[r]].end(),l) ;
		// cout << *i << endl ;
		if(i==mp[a[r]].end()||*i>=r){
			cout << "No" << endl ;
			continue  ;
		}
		// 2 . 找到最小的j>i使s[j]=s[l-1]
		auto j = upper_bound(mp[a[l-1]].begin(),mp[a[l-1]].end(),*i) ;
		// cout << *j << endl ;
		if(j==mp[a[l-1]].end()){cout << "No" << endl ;continue ;}
		// cout << *i << " " << *j << endl ;
		if(*i<*j &&*j<r) cout << "Yes" << endl ;
		else cout << "No" << endl ;
	} 
	cout << endl ;
	return ;
}
 
signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while(_ --) solve();
    return 0;
}

G1. Division + LCP (easy version)

二分 + kmp

也可以Hash做

对前缀长度m进行二分,str = s.substr(0,m) ,用kmp判断是否s中满足能够匹配的数量tmp>=k,那么m合法,反之不合法;

这里KMP直接套模板即可 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define int long long
typedef long long LL;
const int mod = 1e9+7;
const int N = 2e5+10;
using namespace std;

int n,Yss1206,k;
string s ;

bool pd(int m){
	if(m == 0) return 1;
	
	string t = s.substr(0, m);
	vector<int> ne(m + 1, 0);
	
	ne[0] = -1;
	for (int i = 1, j = -1; i < m; i ++ ) {
		while (j >= 0 && t[j + 1] != t[i]) j = ne[j];
		if (t[j + 1] == t[i]) j ++ ;
		ne[i] = j;
	}
	
	int tmp = 0;
	
	for (int i = 0, j = -1; i < n; i ++ ) {
		while (j != -1 && s[i] != t[j + 1]) j = ne[j];
		if (s[i] == t[j + 1]) j ++ ;
		if (j == m - 1) {
			++ tmp;
			j = -1;
		}
	}
	return tmp >= k;
}

inline void solve(){
	cin>>n>>Yss1206>>k;
	cin >> s ;
	int l = 0 , r = n/k ;
	while(l<r){
		int mid = l + r + 1 >> 1 ;
		if(pd(mid)) l = mid ;
		else r = mid - 1 ; 
	}
	cout << l << endl ;
}
 
signed main()
{
    IOS
    int _ = 1;
    cin >> _;
    while(_ --) solve();
    return 0;
}

G2. Division + LCP (hard version)

后面再补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/589943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用vim或gvim编辑程序

vim其实不难使用&#xff0c;学习一下就好了。简单功能很快学会。它有三种模式&#xff1a;命令模式&#xff0c;编辑模式&#xff0c;视模式。打开时在命令模式。在命令模式下按 i 进入编辑模式&#xff0c;在编辑模式下按<Esc>键退出编辑模式。在命令模式按 :wq 保存文…

Python-100-Days: Day08 Object-oriented programming(OOP) basics

OOP definition 把一组数据结构和处理它们的方法组成对象&#xff08;object&#xff09;&#xff0c;把相同行为的对象归纳为类&#xff08;class&#xff09;&#xff0c;通过类的封装&#xff08;encapsulation&#xff09;隐藏内部细节&#xff0c;通过继承&#xff08;in…

C/C++开发环境配置

配置C/C开发环境 1.下载和配置MinGW-w64 编译器套件 下载地址&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下载后解压并放至你容易管理的路径下&#xff08;我是将其放在了D盘的一个software的文件中管理&#xff09; 2.…

古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…

QT5带UI的常用控件

目录 新建工程&#xff0c;Qmainwindow带UI UI设计器 常用控件区 Buttons 按钮 containers 容器 控件属性区域 对象监视区 布局工具区 信号与槽区 简单例子1 放置一个按钮控件&#xff0c;改文本为发送&#xff0c;该按键为Button1&#xff1b; 按钮关联信号和…

点云三角化---------PCL

贪婪三角化 pcl::PolygonMesh PclTool::projectionTriangulation(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {// 正态估计pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n; // 法线估计对象pcl::PointCloud<pcl::N…

刷代码随想录有感(53):合并二叉树

题干&#xff1a; 代码&#xff08;递归实现&#xff09;&#xff1a; TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//前序好理解&#xff0c;直接将树覆盖到另一个上面if(root1 NULL)return root2;//当前遍历节点为空的话就让另一个的值覆盖过来if(root2 NUL…

k8s环境部署gpu以及CUDA兼容性分析

本文记录和学习在实用gpu搭建k8s支持上层应用时的功能实践和遇到的问题。 1. 基础概念 CUDA本质上就是NVIDIA专为通用高性能并行计算设计的一套计算平台和编程模型&#xff0c;换句话使用GPU并行编程的规范方法&#xff0c;所以CUDA在软件层面包含了众多库&#xff0c; 那这里…

【Vulhub靶场】Nginx 漏洞复现

Nginx 漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09;1、影响版本2、漏洞原理3、漏洞复现 二、Nginx 解析漏洞1、版本信息&#xff1a;2、漏洞详情3、漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09; 1、影响版本 Nginx …

python中的self是什么

你对Python编程中的self真的了解吗? 当我们在Python编程的时候,尤其是写一个方法的时候,会自动补齐括号中的self,那么我们对它真的了解吗? Self 是什么?有什么作用? self指的是调用该函数的对象&#xff08;是一个实例&#xff09;,首先明确的是self只有在类中的方法中才…

基于SpringBoot+Vue的旅游网站系统

初衷 在后台收到很多私信是咨询毕业设计怎么做的&#xff1f;有没有好的毕业设计参考?能感觉到现在的毕业生和当时的我有着同样的问题&#xff0c;但是当时的我没有被骗&#xff0c;因为现在很多人是被骗的&#xff0c;还没有出学校还是社会经验少&#xff0c;容易相信别人。…

使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

文章目录 概述安装Android Studio编译源码使用Android Studio打开源码制作ipr文件直接编译成功后自动打开Android Studio 修改SystemUI验证开发环境 概述 我们都知道Android的系统源码量非常之大&#xff0c;大致有frameworka层源码&#xff0c;硬件层(HAL)源码&#xff0c;内…

JSP语法——[JSP]5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

ue引擎游戏开发笔记(26)——处理角色死亡敌人仍攻击bug

1.需求分析 对游戏中存在的各种小问题做细节处理&#xff0c;例如玩家在死亡后&#xff0c;敌人仍对着目标开炮&#xff0c;并且仍然触发爆炸效果。 2.操作实现 1.首先分析问题起因&#xff0c;是由于虽然玩家控制的小车被摧毁了&#xff0c;但控制器仍然存在&#xff0c;没有…

[力扣]——125.验证回文串

class Solution {public static boolean isValidChar(char ch){if((ch > a && ch < z) ||(ch > 0 && ch < 9)){return true;}return false;}public boolean isPalindrome(String s) {// 将大小写统一起来s s.toLowerCase();int left 0, right s…

【介绍下Apache的安装与目录结构】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

全栈开发之路——前端篇(3)setup和响应式数据

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 本文为该系列的第三篇&#xff0c;主要讲述Vue核心的setup语法&#xff0c;同时讲解再使用了setup后如何设置响应式数据。 辅助…

flowable 奇遇

Flowable框架 碰到的问题1. 查询流程执行情况展示2. 查询流程审批人 碰到的问题 1. 查询流程执行情况展示 List<HistoricActivityInstance> list historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId()).orderByHistoricActivit…

信息管理与信息系统就业方向及前景分析

信息管理与信息系统(IMIS)专业的就业方向十分广泛&#xff0c;包含计算机方向、企业信息化管理、数据处理和数据分析等&#xff0c;随着大数据、云计算、人工智能、物联网等技术的兴起&#xff0c;对能够处理复杂信息系统的专业人才需求激增&#xff0c;信息管理与信息系统就业…