Codeforces Round #956 (Div. 2) and ByteRace 2024(A~D题解)

这次比赛也是比较吃亏的,做题顺序出错了,先做的第三个,错在第三个数据点之后,才做的第二个(因为当时有个地方没检查出来)所以这次比赛还是一如既往地打拉了

那么就来发一下题解吧

A. Array Divisibility

题意:对于1<=k<=n,对于每个k其倍数下标之和一定为k的倍数

思路:直接从1赋值到n就行,也是水题一个

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cout<<i<<" ";
		}
		cout<<"\n";
	}
	return 0;
} 

B. Corner Twist

题意:就是给你两个数组,问你两个数组能否按照题上所说的方法相互转换得到

思路:将整个大矩阵拆成2*2的小矩阵,然后每次只要让左上角那个和下面的变成一样就可以,然后我们最后原本只需要检查最后一列和最后一行是否相同就可以(ps:我写的是逐一比较,因为比较好写)(错了一次是因为比较的时候内层循环写成n了)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;
char a[505][505];
char b[505][505];
signed main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>b[i][j];
            }
        }
        for(int i=1;i<=n-1;i++)
        {
            for(int j=1;j<=m-1;j++)
            {
                int cha = ((b[i][j]-'0')-(a[i][j]-'0')+3)%3;
                if(cha==1)
                {
                    a[i][j]=(a[i][j]+1)%3+'0';
                    a[i+1][j+1]=(a[i+1][j+1]+1)%3+'0';
                    a[i+1][j]=(a[i+1][j]+2)%3+'0';
                    a[i][j+1]=(a[i][j+1]+2)%3+'0';
                }
                else if(cha==2)
                {
                    a[i][j]=(a[i][j]+2)%3+'0';
                    a[i+1][j+1]=(a[i+1][j+1]+2)%3+'0';
                    a[i+1][j]=(a[i+1][j]+1)%3+'0';
                    a[i][j+1]=(a[i][j+1]+1)%3+'0';
                }
            }
        }
        int flag=1;
        for(int i=1;i<=n;i++)
        {
        	for(int j=1;j<=m;j++)
        	{
        		if(a[i][j]==b[i][j])
        		{
        			continue;
				}
				else
				flag=0;
			}
		}
		if(flag==0)
		{
			cout<<"NO"<<"\n";
		}
		else
		{
			cout<<"YES"<<"\n";
		}
    }
    return 0;
}

 C. Have Your Cake and Eat It Too

题意:就说有一个蛋糕 ,被分成了许多块,然后三个人对每部分的蛋糕都有一个自己的价值,但是所有块的价值总和是一定的,然后问你如何划分这个区间,才能满足每个区间都大于(tot+2)/3

思路:对六种情况分别贪心即可,先让两边的取到比sum大的位置,然后再看中间的是否比sum大,是的话就直接输出,如果都不满足,最后就只能输出-1了

#include<bits/stdc++.h>
using namespace std;
#define int long long 
signed main()
{
    int t;
    cin>>t;

    while(t--)
	{
        int n;
        cin >> n;
        int a[n+1], b[n+1], c[n+1];
        int sum = 0;
        for(int i = 1;i<=n;i++)
		{
            cin >> a[i];
            sum += a[i];
        }
        sum = (sum+2)/3;//题中说了上限除法 
        for(int i = 1;i<=n;i++)
		{
            cin >> b[i];
        }
        for(int i = 1;i<=n;i++)
		{
            cin >> c[i];
        }
        vector<int> p1(n+5), p2(n+5), p3(n+5);//正序前缀和 
        vector<int> s1(n+5), s2(n+5), s3(n+5);//倒序前缀和 
        for(int i = 1; i <= n; i++)
		{
            p1[i] = p1[i-1] + a[i];
            p2[i] = p2[i-1] + b[i];
            p3[i] = p3[i-1] + c[i];
        }
        for(int i = n; i >= 1; i--)
		{
            s1[i] = s1[i+1] + a[i];
            s2[i] = s2[i+1] + b[i];
            s3[i] = s3[i+1] + c[i];
        }
        //a b c 
        int i = 1, j = n;
        while(p1[i-1] < sum && i <= n)
		{
            i++;
        }
        while(s3[j+1] < sum && j >= 1)
		{
            j--;
        }
        if(i <= j && p2[j]-p2[i-1] >= sum)
		{
            cout << 1 << ' ' << i-1 << ' ' << i << ' ' << j << ' ' << j+1 << ' ' << n << endl;
            continue;
        }
        // a c b
        i = 1, j = n;
        while(p1[i-1] < sum && i <= n)
		{
            i++;
        }
        while(s2[j+1] < sum && j >= 1)
		{
            j--;
        }
        if(i <= j && p3[j]-p3[i-1] >= sum)
		{
            cout << 1 << ' ' << i-1 << ' ' << j+1 << ' ' << n << ' ' << i << ' ' << j << endl;
            continue;
        }
        // b  c a
        i = 1, j = n;
        while(p2[i-1] < sum && i <= n)
		{
            i++;
        }
        while(s1[j+1] < sum && j >= 1)
		{
            j--;
        }
        if(i <= j && p3[j]-p3[i-1] >= sum)
		{
            cout << j+1 << ' ' << n << ' ' << 1 << ' ' << i-1 << ' ' << i << ' ' << j << endl;
            continue;
        }
        // b a c
        i = 1, j = n;
        while(p2[i-1] < sum && i <= n)
		{
            i++;
        }
        while(s3[j+1] < sum && j >= 1)
		{
            j--;
        }
        if(i <= j && p1[j]-p1[i-1] >= sum)
		{
            cout << i << ' ' << j << ' ' << 1 << ' ' << i-1 << ' ' << j+1 << ' ' << n << endl;
            continue;
        }
        // c a b
        i = 1, j = n;
        while(p3[i-1] < sum && i <= n)
		{
            i++;
        }
        while(s2[j+1] < sum && j >= 1)
		{
            j--;
        }
        if(i <= j && p1[j]-p1[i-1] >= sum)
		{
            cout << i << ' ' << j << ' ' << j+1 << ' ' << n << ' ' << 1 << ' ' << i-1 << endl;
            continue;
        }
        //  c b a
        i = 1, j = n;
        while(p3[i-1] < sum && i <= n)
		{
            i++;
        }
        while(s1[j+1] < sum && j >= 1)
		{
            j--;
        }
        if(i <= j && p2[j]-p2[i-1] >= sum)
		{
            cout << j+1 << ' ' << n << ' ' << i << ' ' << j << ' ' << 1 << ' ' << i-1 << endl;
            continue;
        }
        cout << -1 << endl;
    }

    return 0;
}

D. Swap Dilemma

 

 

题意:就是说给你两个数组,然后每次再a数组选两个坐标,b数组选两个坐标,然后各自再各自的数组交换,然后问你最后两个数组能不能变成一样的

思路:这题我想到了两种做法

逆序对法

(1)逆序对的方法,众所周知,在大学有一门神奇的科目叫做线性代数,线性代数里面讲过一个东西叫做逆序对,只有逆序对的个数为同一奇偶性,才有可能相同,因为a,b数组每次都要变换一次,所以他们的奇偶性一定是都会在每一次变化,所以我们需要统计奇偶性,然后来判断,当然了,在之前还需要判断元素种类是否相同,如果个数不同一定为no

#include<bits/stdc++.h>
using namespace std;
#define int long long
int mergeSort(vector<int> &nums, int left, int right) 
{
    if (left >= right) {
        return 0;
    }

    int mid = left + (right - left) / 2;
    int count = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);

    vector<int> tmp(right - left + 1);
    int i = left, j = mid + 1, k = 0;

    while (i <= mid && j <= right) {
        if (nums[i] <= nums[j]) {
            tmp[k++] = nums[i++];
        } else {
            tmp[k++] = nums[j++];
            count += mid - i + 1; // 计算逆序数
        }
    }

    while (i <= mid) {
        tmp[k++] = nums[i++];
    }
    while (j <= right) {
        tmp[k++] = nums[j++];
    }

    for (int p = 0; p < tmp.size(); ++p) {
        nums[left + p] = tmp[p];
    }

    return count;
}

int solve(vector<int> &nums) 
{
    if (nums.size() <= 1) {
        return 0;
    }
    return mergeSort(nums, 0, nums.size() - 1);
}

void solve()
{
	map<int,int> mp;
    int n;
    cin >> n;
    vector<int> a(n+2);
    vector<int> b(n+2);
    for (int i=1;i<=n;i++) 
	cin >> a[i];
    for (int i=1;i<=n;i++)
    {
    	cin >> b[i];
    	mp[b[i]]=i;
	}
    for(int i=1;i<=n;i++)
    {
    	if(mp.count(a[i])==0)
    	{
    		cout<<"NO\n";
    		return ;
		}
	}
    int ans1=solve(a),ans2=solve(b);
    if (ans1%2 ==ans2%2) 
	cout << "YES\n";
    else 
	cout << "NO\n";
}
signed main()
{
    int t;
    cin >> t;
    while (t--) 
	solve();
    return 0;
}

 交换次数法

(2)那么来讲另一种比较简单的方法,交换次数来判断,因为题目上所说每次两个数组都要交换,那么我们就只交换一个,然后统计变成另一个的次数为多少,是偶数就是yes是奇数就是no

当然了,在之前也是需要判断种类是否相同的

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200005], b[200005];
map<int, int> mp;
void solve()
{
	mp.clear();
    int n;
    cin >> n;
    for (int i=1;i<=n;i++) 
	cin >> a[i];
    for (int i=1;i<=n;i++)
	{
        cin >> b[i];
        mp[b[i]]=i;
    }
    int ans = 0;
    for (int i=1;i<=n;i++)
	{
        if (b[i] == a[i]) 
		continue;
        if (mp.count(a[i]) == 0)
		{
            cout << "NO\n";
            return;
        }
        int p=mp[a[i]];
        swap(b[i],b[p]);
        mp[b[i]]=i;
        mp[b[p]]=p;
        ans+=1; 
    }
    if (ans%2 == 0) 
	cout << "YES\n";
    else 
	cout << "NO\n";
}
signed main()
{
    int t;
    cin >> t;
    while (t--) 
	solve();
    return 0;
}

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

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

相关文章

Nifi 与 Kettle

01 Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;可以用于数据集成、数据转换和数据处理等任务。它提供了一组可视化的设计工具&#xff0c;使得用户可以通过简单的拖拽和连接来构建数据流程&#xff0c;并且还支持多种数据…

apache启动报错:the requested operation has failed

Apache24\bin cmd 回车 httpd -t 因为我重新压缩了&#xff0c;记住&#xff0c;重新压缩要使用原路径&#xff0c; 因为你安装的 时候使用的是原路径 还是不行就改个端口&#xff0c;切记修改配置文件httpd.conf先把Tomcat停了 Define SRVROOT "F:\Apache\Apache24&q…

人工智能和机器学习 (复旦大学计算机科学与技术实践工作站)20240703(上午场)人工智能初步、mind+人脸识别

前言 在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;无一不彰显着AI的强大潜力。而人脸识别技术作为AI领域的一项重要应用&#xff0c;更是以其高效、便捷的特点受到了…

什么是Kudu

Kudu是一个由Cloudera于2015年9月开源的分布式数据存储引擎&#xff0c;设计旨在结合Hadoop分布式文件系统&#xff08;HDFS&#xff09;和HBase的优势。Kudu提供了一种既支持高效随机访问又支持数据扫描的能力&#xff0c;适用于需要实时插入、更新和读取数据的场景&#xff0…

决策树算法简单介绍:原理和方案实施

决策树算法介绍&#xff1a;原理和方案实施 决策树&#xff08;Decision Tree&#xff09;是一种常用的机器学习算法&#xff0c;它既可以用于分类任务&#xff0c;也可以用于回归任务。由于其直观性和解释性&#xff0c;决策树在数据分析和模型构建中得到了广泛的应用。本文将…

python爬虫和用腾讯云API接口进行翻译并存入excel,通过本机的Windows任务计划程序定时运行Python脚本!

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a;定时爬取外网的某个页面&#xff0c;并将需要的部分翻译为中文存入excel 接下了的&#xff0c;没学过的最好看一下 基本爬虫的学习 【爬虫】requests 结合 BeautifulSoup抓取网页数据_requests beauti…

科普文:Linux服务器常用命令和脚本

Linux服务器常用的命令&#xff1a;find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk&#xff1b;提供的例子和参数都是最常用和最为实用的。 1.find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 正…

朋友圈发文黄金时段揭秘,一文搞懂私域运营秘诀

猫头虎 &#x1f42f; 建联猫头虎&#xff0c;商务合作&#xff0c;产品评测&#xff0c;产品推广&#xff0c;个人自媒体创作&#xff0c;超级个体&#xff0c;涨粉秘籍&#xff0c;一起探索编程世界的无限可能&#xff01; 掌握朋友圈最佳发文时间&#xff0c;提升互动率&a…

matlab仿真 信道(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 之前的内容还剩下simulink的仿真过程。 3.simulink中的AWGN模块仿真 系统框图如图所示&#xff0c;TX和RX 模块需要单独实现…

【C++ 】-vector:新时代动态数组的革新与未来

目录 1. vector的介绍及使用 1.1 vector的介绍 1.1.1 vector是什么 1.1.2 vector的存储机制 1.2 vector的使用 1.2.1 定义和构造函数 1.2.2 迭代器 1.2.3 容量相关操作 1.2.4 元素访问和修改 1.3 迭代器失效问题 2. vector深度剖析及模拟实现 2.1 std::vector的模拟…

新零售起盘案例「半藏酱酒」布局路径,半藏总院分院招商模式

在当前白酒市场中&#xff0c;一款名为半藏酒的酒品以其独特的新零售模式引起了广泛关注。这种模式不同于传统销售方式&#xff0c;通过多种创新玩法&#xff0c;实现了销售与品牌推广的双重目标&#xff0c;让我们一起来看看细节。 半藏酒的分级代理制度将代理商分为两个层级&…

DETR目标检测框架

概念&#xff1a;DETR&#xff08;Detection Transformer&#xff09;是一种基于Transformer架构的端到端目标检测框架。它与传统的基于区域提议的目标检测方法有所不同。传统方法通常依赖于手工设计的组件&#xff08;如锚框、非极大值抑制等&#xff09;&#xff0c;而DETR将…

Leetcode2542-最大子序列的分数

1.问题转换 首先明确题意&#xff0c;要选取的值和num1&#xff0c;num2两个数组都有关&#xff0c;但是num1中选取的是k个数&#xff0c;num2中选取的是1个数&#xff0c;显然num2中的数所占的权重较大&#xff08;对结果影响较大&#xff09;&#xff0c;所以我们就可以对nu…

【爬虫】Python实现,模拟天眼查登录验证获取token

模拟天眼查登录验证获取token 项目介绍逻辑思路效果演示部分代码展示源代码获取 项目介绍 注&#xff1a;本程序测试时期&#xff1a;2024.7.9&#xff0c;稳定可用 天眼查登录接口升级更新之后&#xff0c;后台接口login接口登录运用了4代极验gt&#xff0c;js逆向部分相当复…

基于网络编码的 tcp 变种-tcp/nc

tcp/nc 是指 “tcp with network coding”&#xff0c;是一种结合了网络编码技术的 tcp 变种&#xff0c;网上资源很少&#xff0c;我也不准备多介绍&#xff0c;只介绍它的核心。 传统 tcp 在演进过程中一直搞不定效率问题&#xff0c;网络带宽在增长&#xff0c;cpu 却没有变…

PHP全民投票微信小程序系统源码

&#x1f5f3;️【全民参与的力量】全民投票系统小程序&#xff0c;让决策更民主&#xff01; &#x1f310; 一键启动&#xff0c;全民参与 全民投票系统小程序&#xff0c;是连接每一个声音的高效桥梁。只需简单几步&#xff0c;即可在线发起投票活动&#xff0c;无论是社区…

mysql数据库中的视图view的概念和详细说明

目录 一、定义 二、视图view的分类 &#xff08;一&#xff09;按功能和特性分类 1、普通视图&#xff08;Regular View/Standard View&#xff09; 2、索引视图&#xff08;Indexed View&#xff09; 3、分割视图&#xff08;Partitioned View/Distributed Partitioned …

Jenkins 构建 Web 项目:构建服务器和部署服务器分离, 并且前后端在一起的项目

构建命令 #!/bin/bash cd ruoyi-ui node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist cp dist.zip ../dist.zip

争议思看科技IPO,创始人妻子郭冬蕾帮助公司“越线”拿补贴?

近日&#xff0c;思看科技&#xff08;杭州&#xff09;股份有限公司&#xff08;下称“思看科技”&#xff09;更新了第二轮回复问询&#xff0c;针对外界及上交所关注的产品技术先进性、市场空间成长性&#xff0c;以及技术专利权纠纷等问题一一进行了回应。 据此前招股书介…

大屏自适应容器组件 v-scale-screen

在vue中&#xff0c;v-scale-screen可用于大屏项目开发&#xff0c;实现屏幕自适应&#xff0c;可根据宽度自适应&#xff0c;高度自适应&#xff0c;和宽高等比例自适应&#xff0c;全屏自适应。 仓库地址&#xff1a;github国内地址&#xff1a;gitee 一、安装 npm instal…