Pinely Round 4 (Div. 1 + Div. 2)

news2024/11/28 4:34:11

有不明白或者想交流一下的可以加一下扣扣:2674993642,博客一般写的时候才看

A. Maximize the Last Element

解析:题目要让一次删除两个相邻的数字,最后留下尽可能最大的数字,赛时我用笔模拟了一下,发现如果我想保留第二个数字,那么必须删除第一个数字,但是必须一次连续删两个数字,所以不行,于是我又打算删第四个,发现也是这样,于是总结了一下,对于偶数位置来说,从左往右删肯定会一个数留着,所以不行。然后我又想了一下奇数位置,发现正好可以把当前位置左边或右边的数删完,因此最终答案只会是奇数位置上的最大值。

#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N=1e6+10;
const int mod=1e9+7;
int a[N];
void solve() {
	int n;
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	int maxx=0;
	for (int i=1;i<=n;i++){
		if (i%2){
			maxx=max(maxx,a[i]);
		}
	}
	cout<<maxx<<"\n";
}

signed main() {
	int T=1;
	cin>>T;
	while(T--) {
		solve();
	}
}

B. AND Reconstruction

解析:构造题,根据题目意思我们可以知道,由b数组来推两边的a数组,赛时我第一反应就是看如何构造一个正确的数组,但这样其实不好发现这道题解法,后面我就推了一下怎样的数组是一个错误的数组,就拿它的样例来说,比如1,2,3转成二进制就是01,10,11,根据与运算的性质,有1必须两个数那个位置全为1,也就是a数组肯定是01,01,1X,11,(X就是说明b[i+1]在该位要求a[i]为1,但b[i-1]在该为要求a[i]为0。因此我们可以先初步用a[i]=(b[i]|b[i+1]),保留下1,再通过(a[i]&a[i+1])判断是否等于b[i],如果不等于则错误。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
const int mod=998244353;
int a[N];
int flag=0;
int b[N];
void solved() {
	int n;
	cin>>n;
	for (int i=1; i<=n-1; i++) {
		cin>>b[i];
	}
	b[0]=0;
	b[n]=0;
	for (int i=1;i<=n;i++){
		a[i]=(b[i-1]|b[i]);	
	}
	for (int i=1;i<=n-1;i++){
		if ((a[i]&a[i+1])!=b[i]){//运算顺序需要打括号
			cout<<"-1\n";
			return;
		}
	}
	for (int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	cout<<"\n";
}
signed main() {
	int t=1;
	cin>>t;
	while (t--) {
		solved();
	}
}

C. Absolute Zero

解析:对这种一眼没头绪的题,我们可以慢慢去发现它的性质,比如将 ai替换为 |ai−x|,那我们就可以发现对于两个数可以通过减去一个中间值((X+Y)/2),变为大小一样的两个数,进而,将变化后的数又与其他数重复这样的操作,从而实现每次通过两个数变成大小一样的数,使整个数组数一样,然后我们就来看什么时候是不能实现的,首先(X+Y)是得能被2整除的,所以两个数奇偶性得是一样,然后我们猜测整个数组得是全奇或者全偶来进行验证,如果不是全奇全偶,那么就得把数组最后变为奇偶性一样的,但是 (X+Y)/2,如果是奇数,对于奇数减去奇数,变偶数,偶数减去奇数,变奇数;如果是偶数,对于奇数减去偶数,还是奇数,偶数减去奇数,还是偶数,所以整个数组必须奇偶性一样,同时我们注意到题目还有个限制次数必须在40次以内,赛时我是觉得每次选最大和最小的就行,最后也过了
在这里插入图片描述
但是如果是全偶得多减一次1,因为比如到减2时,这时a[1]=2,减去之后a[1]=0,下一个到减1,a[1]=0,减去之后a[1]=1,所以得判断一下

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define int long long
const int N=1e6+10;
const int mod=1e9+7;
int a[N];
void solved() {
	int n;
	cin>>n;
	for (int i=1; i<=n; i++) {
		cin>>a[i];
	}
	for (int i=1; i<=n-1; i++) {
		if (a[i]%2!=a[i+1]%2) {
			cout<<"-1\n";
			return;
		}
	}
	vector<int>v;
	for (int i=29; i>=0; i--) {
		int x=(1ll*1)<<i;
		v.push_back(x);
		for (int j=1; j<=n; j++) {
			a[j]=abs(a[j]-x);

		}
	}
	if (a[1]==1) {
		v.push_back(1);
	}
	cout<<v.size()<<"\n";
	for (auto it:v){
		cout<<it<<" ";
	}
	cout<<"\n";
}
signed main() {
	int t=1;
	cin>>t;
	while (t--) {
		solved();
	}
}

D. Prime XOR Coloring

解析:两个数异或是一个质数,质数有一个特殊的是2,其他的都是奇数,所以肯定是一奇一偶异或得到的,那排除2,我们可以把所有奇数涂成一个颜色,所有偶数涂成另一个颜色,这样肯定不会出现有相同颜色了,对于2这个情况,我们得知道哪两个数异或等于2,比如00与10异或等于10,而01与11异或等于10,100与110,101与111,后两位循环,也就是4个一循环,因此我们让所有00为1,01为2,10为3,11为4,就满足要求了。但是得对6之前的特判,因为要满足最小颜色数,到6之前都可以用少于4的满足。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
const int mod=998244353;
int n,m;
int pos;
int a[N];
void solved() {
	int n;
	cin>>n;
	if (n==1) {
		cout<<"1"<<"\n";
		cout<<"1"<<"\n";
	} else if (n==2) {
		cout<<"2"<<"\n";
		cout<<"1 2"<<"\n";
	} else if (n==3) {
		cout<<"2"<<"\n";
		cout<<"1 2 2"<<"\n";
	} else if (n==4) {
		cout<<"3"<<"\n";
		cout<<"1 2 2 3"<<"\n";
	} else if (n==5) {
		cout<<"3"<<"\n";
		cout<<"1 2 2 3 3"<<"\n";
	} else if (n==6) {
		cout<<"4"<<"\n";
		cout<<"1 2 2 3 3 4"<<"\n";
	} else {
		cout<<"4"<<"\n";
		for (int i=1; i<=n; i++) {
			if (i%4==0) {
				cout<<"1"<<" ";
			} else if (i%4==1) {
				cout<<"2"<<" ";
			} else if (i%4==2) {
				cout<<"3"<<" ";
			} else {
				cout<<"4"<<" ";
			}
		}
		cout<<"\n";
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int t=1;
	cin>>t;
	while (t--) {
		solved();
	}
}

E. Coloring Game

解析:这道题需要用到二分图染色,判断奇数环,不懂的可以去B站看董晓老师的二分图染色。二分图染色指的就是如果一个图里面不存在顶点为奇数的环,就可以将这个图分为两部分,并且每一部分里的点都不能直接被里面的点相连
在这里插入图片描述
比如最上面这个图,可以分为{1,4},{2,3,5},这样就是一个二分图,而下面这个图就不为二分图。
而如果这个图是二分图(不存在奇数环)那么将一部分顶点染色成1,另一部分染色成2,这样就不存在连接两个相同颜色顶点的边,进而Bob肯定会胜;当存在奇数环的时候,那么只用两个颜色不可能不存在连接两个相同颜色顶点的边,因此Alice获胜,这时只需采用两个颜色,输出n轮“1 2”。当然奇数环好判断,但是如果Bob获胜时如何用顶点染色呢,因为判断二分图的时候,已经将顶点颜色标好1,2了这时如果输入的是1,3,且1顶点没用完,则将1中的顶点标记为1,如果1用完则将2中的顶点标为2,同理当输入{1,2},{2,3}的情况。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
const int mod=998244353;
int n,m;
int a[N];
vector<int>e[N];
int vis[N];
int flag=0;
void dfs(int x,int c) {
	if (flag==1) {
		return;
	}
	vis[x]=c;
	for (auto v:e[x]) {
		if (!vis[v]) {
			dfs(v,3-c);
		} else if (vis[v]==c) {
			flag=1;
			return;
		}
	}
}
void solved() {
	cin>>n>>m;
	flag=0;
	for (int i=1; i<=n; i++) {
		vis[i]=0;
		e[i].clear();
	}
	for (int i=1; i<=m; i++) {
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for (int i=1; i<=n; i++) {
		if (!vis[i]) {
			flag=0;
			dfs(i,1);
			if (flag==1) {
				break;
			}
		}
	}
	if (flag) { //有奇数环,不能形成二分图
		cout<<"Alice\n";
		int a,b;
		for (int i=1; i<=n; i++) {
			cout<<"1 "<<"2"<<"\n";
			cin>>a>>b;
		}
	} else {
		cout<<"Bob\n";
		queue<int>v1,v2;
		for (int i=1; i<=n; i++) {
		//	cout<<i<<" "<<vis[i]<<"***\n";
			if (vis[i]%2) {
				v1.push(i);
			} else {
				v2.push(i);
			}
		}
		for (int i=1; i<=n; i++) {
			int a,b;
			cin>>a>>b;
			if (a>b) {
				swap(a,b);
			}
			if (a==1&&b==2) {
				if (v1.empty()) {
					cout<<v2.front()<<" "<<2<<"\n";
					v2.pop();
				} else {
					cout<<v1.front()<<" "<<1<<"\n";
					v1.pop();
				}
			} else if (a==1&&b==3) {
				if (v1.empty()) {
					cout<<v2.front()<<" "<<3<<"\n";
					v2.pop();
				} else {
					cout<<v1.front()<<" "<<1<<"\n";
					v1.pop();
				}
			} else if (a==2&&b==3) {
				if (v2.empty()) {
					cout<<v1.front()<<" "<<3<<"\n";
					v1.pop();
				} else {
					cout<<v2.front()<<" "<<2<<"\n";
					v2.pop();
				}
			}
		}
	}
}
signed main() {
//	ios::sync_with_stdio(false);
//	cin.tie(0), cout.tie(0);
	int t=1;
	cin>>t;
	while (t--) {
		solved();
	}
}

F. Triangle Formation

解析:这道题有个不容易发现的地方,因为它给的a[i]范围是1e9,而假设任意三个数字都构不成三角形,那么从最小1,1,到第44个就已经超过1e9了,如果也就是第44个就能插入两个数中间形成三角形,再多加一个就能构成三角形,也就是当r-l+1>45就能构成两个三角形了,当然不用取这么极限,取50都可以。接下来就是考虑在小于50个数字里面判断是否能凑出两个三角形,三角形要满足a1+a2>a3,因此a1,a2,a3要尽量接近,所以我们将范围内这些数排序,然后将所有连续三角形取出来判断是否有没有交集的两个三角形。但是这样会存在特例比如2,2,4,5,10,10,如果按上面算法就不会存在三角形,但是{2,4,5},{2,10,10}可以构成两个三角形,而这时可以用一个性质就是像这种,可以通过判断连续6个里面能形成两个三角形吗,为什么是6呢,不应该更大更好吗?因为首先小于6肯定形成不了两个三角形,而大于6个比如我有7个数字,从小到大排为第1,2,3,4,5,6,7个数字。
如果{1,6,7}形成三角形,那么剩下的数字如果能形成三角形那就剩下{2,3,4},或者{3,4,5},因为3比2更大{2,4,5}不如3+4>5更优,假如是{2,3,4},那么会剩下5,对于{1,6,7}我为什么不选{5,6,7}呢5比1大更容易实现三角形,对于{3,4,5}同理{2,6,7}更优,这样其实6个数字就能包含完了。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
const int mod=998244353;
int a[N];
int flag=0;
int b[N];
int check(int l,int r){
	int index=0;
	for (int i=l;i<=r;i++){
		b[++index]=a[i];
	}
	sort(b+1,b+1+index);
	vector<pair<int,int>>v;
	for (int i=1;i<=index-2;i++){
		if (b[i]+b[i+1]>b[i+2]){
			v.push_back({i,i+2});
		}
	}
	int m=v.size();
	for (int i=0;i<v.size();i++){
		int l1=v[i].first;
		int r1=v[i].second;
		for (int j=i+1;j<v.size();j++){
			int l2=v[j].first;
			int r2=v[j].second;
			if (l2>r1){
				return 1;
			}
		}
	}
	int q[5]={0};
	for (int i=1;i<=index-5;i++){
		for (int j=i+1;j<=i+5;j++){
			for (int k=j+1;k<=i+5;k++){
				int cnt=0;
				for (int m=i+1;m<=i+5;m++){
					if (m!=j&&m!=k){
						q[++cnt]=b[m];
					}
				}
				if (b[i]+b[j]>b[k]&&q[1]+q[2]>q[3]){
					return 1;
				}
			}
		}
	}
	return 0;
}
void solved() {
	int n,q;
	cin>>n>>q;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	while (q--){
		int l,r;
		cin>>l>>r;
		if (r-l+1>48||check(l,r)){
			cout<<"YES\n";
		}else{
			cout<<"NO\n";
		}
	}
}
signed main() {
	int t=1;
//	cin>>t;
	while (t--) {
		solved();
	}
}

总结

1.b题,b[i]|b[i+1],就能将a[i]二进制上应该是1的位置,设为1,赛时,我是每一位每一位设置的,这样写了很久,并且a[i]&a[i+1]检验是否是b[i]
2.c题,奇数减去奇数,变偶数,偶数减去奇数,变奇数;如果是偶数,对于奇数减去偶数,还是奇数,偶数减去奇数,还是偶数。
3.d题:四色定理:如果在平面上劃出一些邻接的有限区域,那么可以用四种颜色来给这些区域染色,使得每两个邻接区域染的颜色都不一样.
4.交互题,不要使用cin加速!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++11,左值引用和右值引用,右值引用的作用

目录 左右值引用概念 右值引用的作用 左右值引用概念 什么是左值&#xff1f;什么是左值引用&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋 值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出…

最详细最新最简单的Jenkins安装使用

首先去jenkins官网下载最新LTS war版本https://www.jenkins.io/download/ 准备sdk包 、nginx配置文件 、已配置的maven文件 查看系统架构 cat /etc/redhat-release uname -a uname -m lscpu安装常用工具 yum install jq -y yum install git -yyum install nginx -y systemc…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师&#xff0c;对JVM及其字节码有着深入的理解。现在&#xf…

DRAM 和 NAND 闪存收入将在 2024 年显著增长 75% 和 77%

#### 市场概况 根据 TrendForce 最新发布的市场报告&#xff0c;预计 2024 年 DRAM 和 NAND 闪存的收入将分别显著增长 75% 和 77%&#xff0c;这一增长主要是由于平均价格的上涨以及高价值产品的兴起&#xff0c;例如 HBM&#xff08;高带宽内存&#xff09;和 QLC&#xff0…

卷积神经网络(六)---实现 cifar10 分类

cifar10 数据集有60000张图片&#xff0c;每张图片的大小都是 32x32 的三通道的彩色图&#xff0c;一共是10种类别、每种类别有6000张图片&#xff0c;如图4.27所示。 图 4.27 cifar数据集 使用前面讲过的残差结构来处理 cifar10 数据集&#xff0c;可以实现比较高的准确率。 …

配置本地开发服务器代理请求以及登录模块开发(二)

项目初始化完成之后&#xff0c;准备开始进行项目的开发&#xff0c;首先配置好开发环境作为整个项目的基础 一、配置代理 1、config/proxy.ts配置代理 export default {// 如果需要自定义本地开发服务器 请取消注释按需调整dev: {// localhost:8000/api/** -> https://p…

Seata 入门与实战

一、什么是 Seata Seata 是一款开源的分布式事务解决方式&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式事务解决方案。 二、Seata 组成 事务协调者&#xff08;Transacti…

什么是Shell?怎么编写和执行Shell脚本?

大家好呀&#xff01;今天来简单介绍一下Shell基础&#xff0c;Shell介于内核与用户之间&#xff0c;是一个命令解释器&#xff0c;负责命令的解释。简单理解&#xff0c;Shell既是一个程序也是一种脚本语言。 1、shell介绍 1.1 概述 shell介于内核与用户之间&#xff0c;是一个…

索引结构—B+Tree索引、Hash索引、Full-Text(全文)索引、R-Tree(空间)索引

一、概述 在数据库系统中&#xff0c;索引是一种用于加快数据检索的数据结构。不同的索引结构适用于不同的查询场景和数据特性。索引按照不同角度可以划分不同类型的索引。按照数据结构可以划分BTree索引、Hash索引、FULL TEXT&#xff08;全文&#xff09;索引、R-Tree&#…

python inf是什么意思

INF / inf&#xff1a;这个值表示“无穷大 (infinity 的缩写)”&#xff0c;即超出了计算机可以表示的浮点数的范围&#xff08;或者说超过了 double 类型的值&#xff09;。例如&#xff0c;当用 0 除一个整数时便会得到一个1.#INF / inf值&#xff1b;相应的&#xff0c;如果…

卡码网KamaCoder 103. 水流问题

题目来源&#xff1a;103. 水流问题 C题解&#xff1a;从边界往高处走&#xff0c;走过的地方做标记。第一组边界跟第二组边界能走到的地方取交集。 代码来源代码随想录。&#xff08;虽然思路一样&#xff0c;但人家代码写得比我好哇&#xff09; #include <iostream>…

pyinstaller带浏览器一起打包playwright 独立运行exe

前置条件 没有安装自带环境&#xff0c;则 playwright install 安装了自带的浏览器 查看playwright的浏览器的位置 playwright install --dry-run 打开此文件夹可以看到 新建一个多层级目录playwright\driver\package.local-browsers 然后复制chromium-1124到playwright\dr…

听说它可以让代码更优雅

一提到静态代码检查工具这个词应该比较好理解&#xff0c;所谓静态代码检查工具就是检查静态代码的工具&#xff0c;完美~ 言归正传&#xff0c;相信很多程序员朋友都听说过静态代码检查工具这个概念&#xff0c;它可能是我们IDE里的某一个插件&#xff0c;可能是计算机中的一…

比 faster-whisper 至少快10倍的音视频转换文字

背景介绍 前两天我自己玩玩搞搞一个音频转文字服务&#xff0c;基于 faster-whisper&#xff0c;本想着这个已经是很快的了&#xff0c;没想到还有比它更快的&#xff0c;今天就来介绍使用一下。 FunClip&#xff0c;是阿里巴巴推出的一个智能视频剪辑工具&#xff0c;它结合…

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[Bugku] web-CTF靶场详解!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境&#xff1a; 页面提示传入参数f…

【Qt】QLCDNumberQProgressBarQCalendarWidget

目录 QLCDNumber 倒计时小程序 相关属性 QProgressBar 进度条小程序 相关设置 QLCDNumber QLCDNumber是Qt框架中用于显示数字或计数值的小部件。通常用于显示整数值&#xff0c;例如时钟、计时器、计数器等 常用属性 属性说明intValueQLCDNumber显示的初始值(int类型)va…

【全面介绍下Gitea,什么是Gitea?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

这几个高级爬虫软件和插件真的强!

亮数据&#xff08;Bright Data&#xff09; 亮数据是一款强大的数据采集工具&#xff0c;以其全球代理IP网络和强大数据采集技术而闻名。它能够轻松采集各种网页数据&#xff0c;包括产品信息、价格、评论和社交媒体数据等。 网站&#xff1a;https://get.brightdata.com/we…

ubuntu安装并配置flameshot截图软件

参考&#xff1a;flameshot key-bindins 安装 sudo apt install flameshot自定义快捷键 Settings->Keyboard->View and Customize Shortcuts->Custom Shortcuts&#xff0c;输入该快捷键名称&#xff08;自定义&#xff09;&#xff0c;然后输入command&#xff08;…