Codeforces Round 1006 (Div. 3) 比赛记录

Codeforces Round 1006 (Div. 3) 比赛记录

比赛链接
这场的题目名称都很长啊~。
很简单的一场(毕竟是div3,能不简单嘛)赛时切掉了A - F,C题花的时间有点多,G题偶遇数学压轴拼尽全力无法战胜。

A. New World, New Me, New Array

由于取值范围是 \(-p\)\(p\),所以很明显 \(k\) 的正负是无所谓的,所以只需要判断最大能取到的值能否大于等于 \(k\),然后用 \(k\) 除以 \(p\) 向下取整即可。

void solve()
{int n, k, p;cin >> n >> k >> p;k = abs(k);int mx = n * p;if(k == 0) {cout << 0 << '\n';return;}if(k > mx) {cout << -1 << '\n';return;} else {cout << (k - 1) / p + 1 << '\n';}
}

B. Having Been a Treasurer in the Past, I Help Goblins Deceive

组合数学问题,两个 - 和一个 _ 来组成一个表情,很明显,要最多的话,我们把所有的 _ 放在一起是最有的,因为此时他们可以共享所有的 -,然后再枚举一下左右两边 - 的数量乘一下取最大即可。

void solve()
{int n;cin >> n;string s;cin >> s;int cnt = 0;int ck = 0;for(auto &i : s) {cnt += (i == '-');ck += (i == '_');}int ans = 0;for(int i = 1;i <= cnt;i ++) {ans = max(ans, i * (cnt - i) * ck);}cout << ans << '\n';
}

C. Creating Keys for StORages Has Become My Main Skill

题目要我们构造出来的 \(MEX\) 值仅可能大,那就直接从 \(0\) 开始枚举呗,检验一下这个数字能否加入,能加入就加入,不能加入就停止循环,然后检验一下此时的前缀或和是否为 \(x\),如果不是,那么就把下一个数设置为 \(x\)(如果位置不够用了,就把当前最后一个设置为 \(x\)),然后继续往后填 \(0\)
赛后在群里看到了其他大佬更优雅的做法:先把 \(0\)\(n - 1\) 全部加入,然后逐个检测是否合法,不合法就换为 \(x\),然后再前缀或和算一下,如果不是 \(x\) 就把最后一个换为 \(x\)

//其实这个check可以直接用 x | i == i来替换,赛时铸币了
bool check(int x, int y) {for(int i = 0;i <= 31;i ++) {if(!(x & (1ll << i)) && (y & (1ll << i))) {return false;}}return true;
}void solve()
{int n, x;cin >> n >> x;int ix = 0;for(int i = 0;ix < n;i ++) {if(check(x, i)) {a[++ ix] = i;} else break;}int pre = 0;for(int i = 1;i <= ix;i ++) {pre |= a[i];}if(pre != x) {if(ix == n)a[ix] = x;else a[++ ix] = x;}while(ix <= n) {a[++ ix] = 0;}for(int i = 1;i <= n;i ++) {cout << a[i] << " \n"[i == n];}}

D. For Wizards, the Exam Is Easy, but I Couldn't Handle It

选择一个子区间,把区间头移动到尾部,使得改动后逆序对尽可能少。
看到逆序对,首先想到了树状数组,然后一看数据范围:\(1000\)?!
直接 \(n ^ 2\) 暴力启动。
枚举每一个点 \(i\) 作为起点,往后搜索 \(j\),如果 \(a_j > a_i\),移动后会让逆序对增加 \(1\),如果 \(a_j < a_i\),移动后会让逆序对减少 \(1\),时时更新当前逆序对的减少数,一旦减得更多了,就更新答案区间。

void solve()
{int n;cin >> n;for(int i = 1;i <= n;i ++)cin >> a[i];pair<int, int> ans = {1, 1};int mx = 0;int sum[2] = {0};for(int i = 1;i <= n;i ++) {sum[1] = 0;sum[0] = 0;for(int j = i + 1;j <= n;j ++) {if(a[j] < a[i])sum[1] ++;if(a[j] > a[i])sum[0] ++;int now = sum[1] - sum[0];if(now > mx) {ans = {i, j};mx = now;}}}cout << ans.first << ' ' << ans.second << '\n';
}

E. Do You Love Your Hero and His Two-Hit Multi-Target Attacks?

这个题可以用类似倍增的想法来做。
如果一堆点 \(x\) 坐标相同,那么这一堆点里面可以选出来的对数是 \(C(n, 2)\)
那么我们可以先预处理 \(1\)\(500\)\(C(n, 2)\) 的值,然后每次挑尽可能大的满足小于等于当前剩余值的 \(n\)来连成一条线,这个可以二分实现。
为了节约,我们可以一条竖着一条横着这么放,这样每次都可以省下来一个(但其实是不需要的,只需要每次结束时 \(x\)\(y\) 都加一就能和上一条断开了,数量也是足够的,并不需要省)。

void init() {for(int i = 1;i <= 500;i ++) {a[i] = i * (i - 1) / 2;}
}void solve()
{int k;cin >> k;int ix = upper_bound(a + 1, a + 500 + 1, k) - a;int sum = k;int cnt = 0;int x = 0;int y = 0;vector<pair<int, int> > ans;ans.push_back({0, 0});while(sum) {cnt ++;int ix = upper_bound(a + 1, a + 500 + 1, sum) - a - 1;sum -= a[ix];if(cnt & 1) {x ++;for(int i = 1;i < ix;i ++) {ans.push_back({x, y});x ++;}x --;} else {y ++;for(int i = 1;i < ix;i ++) {ans.push_back({x, y});y ++;}y --;}}cout << ans.size() << '\n';for(auto &[u, v ] : ans) {cout << u << ' ' << v << '\n';}
}

F. Goodbye, Banker Life

手玩几个样例后发现和 \(k\) 根本没有任何关系。
打表可以发现,如果 \(x\) 是偶数的话,这一行的构造就相当于 \(x / 2\) 行的构造每个数字相邻出现两次。
因此选择递归实现:

  • 如果 \(x\) 是偶数,那就往 \(x / 2\) 递归,传递时把每个值相邻堆叠两次。
  • 如果 \(x\) 是奇数,那么 \(x - 1\) 就是偶数,向 \(x - 1\) 递归,然后按题目规则算 \(x\) 行即可。

但实际上这个做法是复杂了的,因为其实每一个位置异或上 \(1\) 的次数,就是这个位置的杨辉三角值,题目的传递方式也是按杨辉三角的规则进行传递的。
所以只需要计算这个位置的组合数是奇数还是偶数,就知道这个位置是 \(0\) 还是 \(1\) 了。
最后全部乘上 \(k\) 就行。
(不过我觉得递归做法也还是蛮巧妙的)

void get(int x) {if(x == 1) {a[1] = 1;return;}if(x & 1) {get(x - 1);for(int i = 1;i <= x;i ++) {if(i == 1) {tmp[i] = a[i];} else if(i == x) {tmp[i] = a[1];} else {tmp[i] = a[i - 1] ^ a[i];}}for(int i = 1;i <= x;i ++) {a[i] = tmp[i];}} else {get(x / 2);for(int i = 1;i <= x / 2;i ++) {tmp[i * 2] = tmp[i * 2 - 1] = a[i];}for(int i = 1;i <= x;i ++) {a[i] = tmp[i];}} 
}void solve()
{int n, k;cin >> n >> k;get(n);for(int i = 1;i <= n;i ++) {cout << a[i] * k << " \n"[i == n];}
}

离 AK 最近的一次,希望有朝一日能 AK div3!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年我读过的10本技术书籍(Java、架构、SRE运维)

什么是一本好书? 首先,我们需要定义什么是一本有价值的书籍。个人认为,一本好书应该具备以下特点:它能让我理解其中的一半+内容,引发共鸣,而剩下的部分内容则需要我反复阅读才能逐渐领会。如果我读完后发现完全理解了,那么这本书对我来说意义不大,因为它没有挑战我的思…

如何在WEB前端页面嵌入桌面程序EXE运行窗口?

在数字化转型浪潮中,企业常面临WEB与本地桌面应用割裂的痛点:‌复杂文档编辑需频繁切换系统,专属行业软件无法融入B/S架构‌……如何在WEB页面中直接调用并嵌入EXE程序窗口,实现真正的“云端+本地”一体化体验?猿大师中间件自从2019年发布以来,已经发布了三个重要产品:猿…

探索2025年客户管理新方向,看这家企业如何成功落地

某企业近年来销售业绩一直停滞不前,尽管产品质量过硬,企业的销售业绩却始终未能实现预期的突破。企业内部对销售策略进行了深入分析,发现销售业绩不佳的主要原因在于重复购买率低。 在管理层进一步分析后,发现是企业的销售和市场推广手段过于单一,缺乏有效的客户留存策略。…

使用Git拉取项目并对idea,vs-code配置(图解)

方法一:在线拉取(直接拉取到本地文档,后面还有一个IDEA直接在线拉取)在gitee中找到自己要拉取的项目,点击克隆/下载 对下图标红的命令复制打开你的文档,这个文件夹(名称不为中文)自己选择(想把项目保存到哪里看自己),我这里随便新建了一个文件夹。 注意:在这…

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

ReAct:结合推理(COT)和行动(动作生成)。 ReAct主要内容将COT方法与ACT方法结合起来,引入了 ReAct,这是一种新的基于提示的范式,旨在将推理和行动在语言模型中协同起来,以解决通用任务。 展示了在少样本学习设置中,ReAct 相较于仅进行推理或动作生成的先前方法的优势。…

数字孪生城市:北斗网格码破解地下管网难题!

城市地下管网如同人体的“血管”和“神经”,承载着供水、供电、燃气、通信等核心功能。然而,传统管理模式长期面临“看不见、摸不着、管不好”的困境:施工误挖、管线老化、信息孤岛等问题频发,每年因管网事故造成的经济损失高达数百亿元。如何破解这一难题?北斗网格码技术…

供应链管理系统--升鲜宝收银系统功能解析,登录、主界面UI 设计图(一)

供应链管理系统--升鲜宝收银系统功能解析,登录、主界面UI 设计图(一)登录界面

振动电阻式传感器测量模块 差动电阻式 驱动与测量RM502

振动电阻式传感器测量模块 差动电阻式 驱动与测量RM502RM502模块是一款高精度、多功能的传感器驱动与测量解决方案。本产品采用先进的模拟信号处理技术,专为差动电阻式传感器及其他高精度电阻测量应用而设计。通过恒流驱动与4路实时电流测量技术,配合高精度采样电阻,有效消除…

No.13 CSS--简介

一、CSS 1.1概念CSS(Cascading Style Sheets)层叠样式表,又叫级联样式表,简称样式表。 CSS文件后缀名为 .css。 CSS用于HTML文档中元素样式的定义。1.2 作用使用css的目的就是让网页具有美观一致的页面。1.3 语法CSS 规则由两个主要的部分构成 : 选择器,以及一条或多条声明(…

Go红队开发—并发编程

Go红队开发之并发编程目录并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道等协程sync.WaitGroup同步Runtime包Gosched()Goexit()区别同步变量sync.Mutex互斥锁atomic原子变量SelectTicker定时器控制并发数量核心机制并发编程阶段练习重要的细节端口扫描股票监…

【DeepSeek部署实战】正点原子RK3588开发板本地化部署DeepSeek R1 大模型视频教程来啦!

【视频发布】正点原子RK3588开发板本地化部署DeepSeek R1 大模型视频系列视频教程来啦!一、课程内容 承接上一次板端部署DeepSeek R1大模型的文档教程,应粉丝们的要求,本次推出视频教程,手把手教学实现端侧部署,无需依赖云端服务器即可本地化处理数据,功耗更低、成本更优…

接口新特性--java进阶day03

1.接口新特性 在JDk8和JDK9开始,接口可以定义普通方法这时就会感到很奇怪,明明之前说好接口只是用来制定规则的,为什么现在又可以定义普通方法了呢? 我们以一个公司案例进行讲解,公司1.0上线了接口,之后有新项目,要更新接口,但我们都知道,接口如果写了新的方法,之前所…