Codeforces#808(Div.2)A-D题解

2023-11-12

目录

A. Difference Operations

B. Difference of GCDs

C. Doremy's IQ

D. Difference Array


A. Difference Operations

Problem - A - Codeforces

 题意:给一串长度为n的数,对于下标 i 范围 [2,n] ,可以执行a[i]=a[i]-a[i-1]的操作,操作次数不限,问能否可以变成第2~n位都是0.

思路:其实就是要后面每个数都得是第一个数的倍数就行了。【亏我之前还分析了那么久,一开始以为要递增,但可以递减,但必须满足第二个数大于等于第一个数啥啥啥的,还wa了几发...后面才推出这个关系,(不然是消不干净的】

这代码也要贴嘛?算了贴一下吧,毕竟我个菜鸡折腾了那么久qwq

#include<iostream>
using namespace std;
int n,a[110];
void solve(){
	cin>>n;
	int f=0;
	cin>>a[1];
	
	for(int i=2;i<=n;i++){
		cin>>a[i];
		if(a[i]%a[1])f=1;
	}
	cout<<(f?"NO\n":"YES\n");	
	
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t;cin>>t;
	while(t--)solve();
	return 0;
}

B. Difference of GCDs

Problem - B - Codeforces

 题意:给你三个数 n, l , r,问你能不能构造一个长度为 n 的数组并且数组元素大小要在 [ l , r ]之间,使得数组元素与对应下标的最大公因数各不相同,如果能就YES输出任意一种,不然输出NO

分析:其实很容易就看出来各组的最大公因数就是下标本身(因为下标就是从1开始递增,最大公因数又不能超过它,又要求各不相同,那不就是下标了)然后就是看能不能在 [ l, r ] 区间内找到该下标的倍数惹~ 我当时推的公式是  tp=l+i-l%i ,然而刚发现如果恰好 l 是 i 倍数的情况没考虑。。所以是这样才对:

int tp;
if(l%i)tp=l+i-l%i;
else tp=l;
if(tp<=r)ans[++ct]=tp;

但是我wa的主要原因还是在于。。多了个特判n<=r-l+1。因为可以重复取同一个数嘛,就没必要这个条件了(错了傻傻不知道的我www)然后是jj告诉我这个错误的,她的公式就很棒啊:tp=r/i*i;

#include<iostream>
using namespace std;
typedef long long ll;
const int M=1e5+6;
ll n,l,r,ans[M];
void solve(){
	cin>>n>>l>>r;
	//if(n>r-l+1){cout<<"NO\n";return;}这句别要,因为可以重复用一个数哇www 
	for(int i=0;i<=n;i++)ans[i]=0;
	int ct=0;
	for(int i=1;i<=n;i++){
		ll tp=r/i*i;
		if(tp>=l&&tp<=r)ans[++ct]=tp;
		else{cout<<"NO\n";return;}
	}
	cout<<"YES\n";
	for(int i=1;i<=ct;i++)cout<<ans[i]<<' ';
	cout<<'\n';
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t;cin>>t;
	while(t--)solve();
	return 0;
}

以上为比赛时 过了的俩,后面CD是补题(当时C真不觉得自己错了的。。后面jj一讲。错误百出)

总之学姐说的太对了,1.我的出题速度太慢了,得多做思维题才行(cf前面的题基本就只是思维都没啥算法)2.然后要学会“跟榜”,很多人都能过的,我的又过了样例的,那基本就得看看开long long 没了,(然后很少会因为 long long 卡时间,所以多开点 long long 没关系)3.要多自己debug,知道自己错哪些地方,输出中间变量啥的(其实我有啊www)plus:思维,会思考,是   OIer 亦或是 Acmer 最重要、最基本的要求。


C. Doremy's IQ

Problem - C - Codeforces

 题意:某人被要求测试n场比赛,给出比赛难度与此人初始IQ, 若比赛难度大于此时IQIQ值就会减一,否则IQ值无变化,IQ值必须大于0时才能进行测试,问最多能测试几个。

分析:(方括号内的 菜鸡错误过程 可忽略,直接看后面黑体即可)

【我一开始就想着,最后 q ( IQ 值)场肯定能测,然后前面的要是难度不大于 q 就可以.....感觉有点像是倒推的想法了,但是(肯定)过不了。。后面jj跟我讲我思路的问题:后面几场可能不大于IQ值啊,我的太“静态”了。方才听到pbrjj 真正的倒推思路:设一个值,从后往前,碰到大于的就加一,直到与IQ相等(!)然后第二天一早我就去敲,调了半天过不了。。拜谢学姐再次出马教与我倒推,我的“倒推”极不“标准”我的tp值是从1开始的...就当作进入测试的时候的IQ值啥的,而且每次都是与题给的初始IQ值比较...】所以应该从最后的0开始,与当前的tp值比较大小,一路往前推直至tp==q(IQ值已拉满了)

#include<iostream>
#include<algorithm>
using namespace std;
 const int M=1e5+6;
int n,q,a[M],f[M];
void solve(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)f[i]=0;
	for(int i=1;i<=n;i++)cin>>a[i];
	int tp=0;
	for(int i=n;i;i--){
		if(a[i]<=tp)f[i]=1;
		if(a[i]>tp&&tp<q)tp++,f[i]=1;
	} 
	for(int i=1;i<=n;i++)cout<<f[i];
	cout<<'\n';
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t;cin>>t;
	while(t--)solve();
	return 0;
}

jj是用二分写的,看题解也看到了二分的方法(真的好多题目都可以用二分啊  可惜我个fw不熟悉,害怕二分www)在这里贴一下: 算了刚看了下没看懂。。。学二分学二分www

D. Difference Array

Problem - D - Codeforces

 题意:给你一个长为n的数组 a,然后你得到它的差分数组 b ,把 b 从小到大排序,再算它的差分数组......重复此过程直至只剩一个数,输出这个数。

分析:0的数量会爆增...( ! ) 所以按学长的话就是直接模拟就能过,维护好数组,不要把0放进去。=.=然后看题解,看到用map的,还用了lambda表达式(又叫“匿名函数”)看懂后我直呼妙哉好吧。。关于lambda表达式,之前见过(学长代码里)(学长还发了他写的博客,但写得太高级了窝没看懂qwq)这里有篇通俗易懂的:C++Lambda表达式,超详细的讲解,保证一遍懂_Zjkai_的博客-CSDN博客_c++ lambda

奉上代码:

#include<iostream>
#include<map>
using namespace std;
int n;
void solve(){
	cin>>n;
	map<int,int> mp;
	auto work=[&](){//lambda表达式 
		map<int,int> mp1;
		for(auto it = mp.begin(); it != mp.end(); it++){
			if(it->second > 1)mp1[0]+=it->second -1;
			auto it1 = it; it1++;
			if(it1 != mp.end())mp1[it1->first - it->first]++;
		}
		mp=mp1;
	};//lambda表达式结尾要分号... 
	for(int i=1,x;i<=n;i++)cin>>x,mp[x]++;
	for(int i=1;i<n;i++)work();
	cout<<mp.begin()->first<<'\n';
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t;cin>>t;
	while(t--)solve();
	return 0;
}

没错我还是看到了二分的大佬题解,原文片段如下

2 5 8 10 13 17 22 28 -- 差分 --> 3 3 2 3 4 5 6 -- sort --> 2 3 3 3 4 5 6 
2 3 3 3 4 5 6 -- 差分 --> 1 0 0 0 1 1 1 -- sort --> 0 0 0 1 1 1 1
0 0 1 0 0 0 -- 差分 --> 0 0 0 0 1 此时已经发现结果最后必然是1了。  n为8但是我们只差分了3次

我们发现0的数量是会突然巨增的(多造几组样例试试),如何减少时间复杂度呢?忽略大量的0即可,我们只需要找到第一个非0的位置,在这个位置之后进行差分即可。每一次去模拟这个过程,所有位置要先左移一格,因为a[1]会不断删去,然后直接暴力遍历找非0位置,也可以二分(时间复杂度都允许,因为0的出现非常的多),记录非0位置,从这个位置开始往后做差分,若非0位置的数只剩一个了那么就可以停止循环。其实他的时间复杂度是远低于n^2logn的。

注意在做差分的时候其实找的是最后一个0,因为这个0对后面的差分仍然具有贡献,看上面模拟的样例,这道题的边界问题比较复杂,我注释写的比较详细了。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
#define NO {puts("NO") ; return ;}
#define YES {puts("YES") ; return ;}
const int N = 2e5 + 10 , INF = 0x3f3f3f3f;
int n, m, a[N], p;

void solve()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i ++ ) cin >> a[i];
    for(int i = 1 ; i <= n ; i ++ )
        if(a[i]) {p = i - 1; break;} // 找末尾0
        
    while(n > 1) // 循环结束的条件是n的长度为1
    {
        for(int i = max(1, p) ; i <= n - 1 ; i ++ ) // 从p到n做差分
            a[i] = a[i + 1] - a[i];  // 注意p不能是0,最少是1,假如没有0的话p算出来就是0,出界了
        n -- ; // n 缩小
        sort(a + p , a + n + 1); // 排序
        // 二分找末尾0
        int l = 0, r = n;
        while(l < r)
        {
            int mid = l + r + 1 >> 1;
            if(a[mid]) r = mid - 1;
            else l = mid;
        }
        p = l;
        if(l + 1 == n) break; // l+1是第一个非0位置,如果第一个非0是n那么说明只有一个数非0,直接退出循环即可。
    }
    cout << a[n] << endl;
}

int main()
{
    int T;
    cin >> T;
    while(T -- ) solve();
    return 0;
}

!!!太菜了www我要去学二分www(然鹅dp折腾快两周了还是没学明白。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Codeforces#808(Div.2)A-D题解 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • mac vscode 跳转函数_VSCode快捷键大全(Mac)

    记录一下总是忘记 通用 P F1 显示控制台 P 快速打开 快速查找并进入文件 N 新建窗口 不是文件 W 关闭窗口 基本编辑 X 删除整行 不需要选中 C 复制整行 不需要选中 上下移动整行 复制整行 并粘贴到此行的上面 下面 K 删除行
  • get和post区别

    get和post区别 get参数通过url传递 post放在request body中 get请求在url中传递的参数是有长度限制的 而post没有 get比post更不安全 因为参数直接暴露在url中 所以不能用来传递敏感信息 get请求
  • VWWare(虚拟机)下安装 Windows Server 2012 r2 (详细图文)

    VWWare 虚拟机 下安装 Windows Server 2012 r2 详细图文 第一 软件准备 WMware Workstation Pro 14 虚拟机 Windows Server 2012 r2 windwos镜像 第二 安装
  • 基于C#窗体的学生成绩/信息管理系统

    一 概述 前段时间发布了一个网页版的基于C 的学生信息管理系统 有很多同学都跑来问我有没有窗体版本的 所以为了满足大家的要求 在近段时间就写了一个窗体版的学生成绩 信息管理系统 学生成绩 信息管理是一个必不可少的重要环节 开发系统的意义在于
  • java的基础特性

    Java基础特性 与cmd的交互 1 1 什么是cmd 就是在windows操作系统中 利用命令行的方式去操作计算机 我们可以利用cmd命令去操作计算机 比如 打开文件 打开文件夹 创建文件夹等 1 2 如何打开CMD窗口 按下快捷键 wi
  • writeAsBytes writeAsString

    import dart io import dart convert main async File a File C aria2 1 txt var c read a print c var d utf8 decode c print d
  • 编辑距离算法(Minimum Edit Distance,MED)

    算法简介 编辑距离 又称Levenshtein距离 莱文斯坦距离也叫做Edit Distance 是指两个字串之间 由一个转成另一个所需的最少编辑操作次数 如果它们的距离越大 说明它们越是不同 许可的编辑操作包括将一个字符替换成另一个字符
  • 风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)

    本笔记源于CDA DSC课程 由常国珍老师主讲 该训练营第一期为风控主题 培训内容十分紧凑 非常好 推荐 CDA数据科学家训练营 一 风控建模流程以及分类模型建设 1 建模流程 该图源自课程讲义 主要将建模过程分为了五类 数据准备 变量粗筛
  • 商标注册查询入口官网

    商标注册查询入口官网在国家知识产权局商标局 中国商标网中查询 包括商标近似查询 商标综合查询 商标状态查询和商标公告查询 TM83商标网来详细说下商标注册查询入口官网链接地址及查询方法流程 商标注册查询入口官网链接 商标注册是在国家知识产权
  • 王者荣耀 露娜 技巧-教学-总结

    文章目录 参考教程 技巧和个人理解 连招训练方法 出装顺序 赞同参考教程 节奏顺序 团战 个人遇到的坑 补充描述 参考教程 王者荣耀 国服榜一露娜深度教学 月下无限连 实战案例分析 哔哩哔哩 露娜教程很多 虎牙直播多 技巧和个人理解 连招训
  • buuctf [struts2]s2-009

    漏洞描述 这个漏洞跟s2 003 s2 005 属于一套的 Struts2对s2 003的修复方法是禁止 号 于是s2 005通过使用编码 u0023或 43来绕过 于是Struts2对s2 005的修复方法是禁止 等特殊符号 使用户不能提
  • vue-router 基本使用

    路由 其实就是指向的意思 当我点击页面上的home按钮时 页面中就要显示home的内容 如果点击页面上的about 按钮 页面中就要显示about 的内容 Home按钮 gt home 内容 about按钮 gt about 内容 也可以说
  • xp无法远程计算机共享,解决XP局域网共享不能访问的问题

    1 检查guest帐户是否开启 XP默认情况下是不开启guest帐户的 因些为了其他的人能浏览你的计算机 请启用guest帐户 为了安全请为guest设置密码或相应的权限 你也可以为每一台机器设置一个用户名和密码以便计算机之间的互相访问 2
  • 面向数据流的方法设计系统的软件结构(储蓄系统)

    RT 事务流
  • mongodb安装

    mongodb安装 提示 ubuntu 18 04 mongodb 4 0 28 文章目录 mongodb安装 前言 一 下载解压安装包 二 在 etc profile文件中添加如下内容 生效环境变量 三 创建数据库目录 前言 MongoD
  • 面试总结-2023届安全面试题总汇

    2023届安全面试题总汇 文章目录 2023届安全面试题总汇 前言 0x01 秋招目录 随时更新 0x02 各大安全厂商面试题 资料链接 一个2023届毕业生在毕业前持续更新 收集的安全岗面试题及面试经验分享 前言 最近发现一个宝贵的面试文
  • vector的find用法

    一 find函数存在于算法中 其头文件为 include
  • 驱动 - platform总线驱动

    include
  • 怎么求解100个正整数的最大公约数python

    答 你可以使用Python中的fractions模块来求解100个正整数的最大公约数 你需要先导入它 import fractions 然后你可以使用fractions gcd函数来求解 fractions gcd 100 200
  • Codeforces#808(Div.2)A-D题解

    目录 A Difference Operations B Difference of GCDs C Doremy s IQ D Difference Array A Difference Operations Problem A Codef