07_05_暑期个人赛2

news/2024/10/5 13:42:07/文章来源:https://www.cnblogs.com/lulaalu/p/18287595

B. Sum of Two Numbers

时间:2024-07-06

原题:Codeforces Round 851 (Div. 2)B. Sum of Two Numbers

题意

一个数字 \(n\) ,将其分解为两个数字 \(x\)\(y\) ,要求:

  • \(x+y=n\)

  • \(dig(x)-dig(y)=\pm1\)

\(dig(x)\) 表示 \(x\) 的所有位数之和

思路

对于每一位,都可以将其平均,每次遇到奇数就分配给 \(x\) ,下一次遇到再给 \(y\)

代码

void solve() {cin >> n;if (n % 2 == 0) {cout << n / 2 << " " << n / 2 << endl;return;}// a1,a2是最终答案int a1=0, a2=0;// i表示分解的位数int i = 0;// c表示分解n的第i位时如果出现奇数将较大的一个数给a1还是a2int c = 0;while (n) {int d = pow(10, i);int base = n % 10;int base1 = base / 2, base2 = base / 2  + base % 2;if (c % 2 == 1) {a1 += base1 * d;a2 += base2 * d;if(base1!=base2)c++;}else {a1 += base2 * d;a2 += base1 * d;if (base1 != base2)c++;}n /= 10;i++;}cout << a1 << " " << a2 << endl;
}

C. New Year and Rating

时间:2024-07-06

原题:Good Bye 2016 C. New Year and Rating

题意

1900是一个分界线,线上规定为等级1(包括1900),线下规定为等级2

\(n\) 次比赛,每次给出比赛前的等级和本次比赛获得的分数,要求输出

思路

对于等级和得分,我们可以用一个 \(value\) 表示改变的可能性

即如果为等级1,并且是加分,\(value=1\) ,等级不会改变

并且可以知道此时的分数变化对上下限不产生影响

如果等级为1,但是是扣分,\(value=-1\),等级可能会影响

  • 如果等级没掉,可以确定下限
  • 如果等级掉了,可以确定上限

最后如果出现错误的等级变化或者上限小于下限,则Impossible

代码

#define IMP "Impossible"
#define INF "Infinity"
#define int long long
#define rep(i,j,k) for(i=(j);i<(k);i++)const int N = 2e5+10;
int ii, jj, kk;int n;
struct Node {int c, d;
}node[N];
int sum[N];
void solve() {cin >> n;sum[0] = 0;rep(ii, 1, n+1) {cin >> node[ii].c >> node[ii].d;sum[ii] = sum[ii - 1] + node[ii].c;}//上界下界,包含边界int to = 1e9, bo = -1e9;if (node[1].d == 1) bo = 1900;else to = 1899;rep(ii, 1, n) {//在线上往下降//在线下往上升//线上1 上升1int value = (node[ii].d == 1 ? 1 : -1) * (node[ii].c >= 0 ? 1 : -1);if (node[ii].c == 0 && node[ii].d!=node[ii+1].d) {cout << IMP << endl;return;}//有判断价值if (value < 0) {//当前在1,但是掉分if (node[ii].d == 1) {//掉分没掉下1if (node[ii + 1].d == 1) {bo = max(bo, 1900 - sum[ii]);}//掉分掉到2else {to = min(to, 1899 - sum[ii]);}}else {//上大分if (node[ii + 1].d == 1) {bo = max(bo, 1900 - sum[ii]);}//上小分else {to = min(to, 1899 - sum[ii]);}}}// 可以融合成一个// value>0时// 如果线上上分变成线下||线下掉分变成线上else {if (node[ii].d != node[ii + 1].d) {cout << IMP << endl;return;}}}if (bo > to) {cout << IMP << endl;}else if (to != 1e9) {cout << to + sum[n] << endl;}else {cout << INF << endl;}
}

D. Petya, Petya, Petr, and Palindromes

时间:2024-07-06

原题:Codeforces Round 861 (Div. 2)D. Petya, Petya, Petr, and Palindromes

思路来源:https://zhuanlan.zhihu.com/p/618268493

题意

给定序列 \(a\),长度为\(n\),要求对在 \(a\) 中的所有长度为 \(k\) 的序列进行处理,要替换几个数字能将其变成回文序列

\(k\) 为奇数

比如 \([1,2,3,3,1,4,5]\)\(k\) 为5,那么对于子序列之一\([1,2,3,3,1]\),需要变3为2,\([1,2,3,2,1]\),答案加1

思路

首先排除暴力,但是如果要计算所有不同的对数,必须要每个比较一次,则这个思路不行

所以选择计算所有的可能,然后再减去相同的对数。

1

在一开始对题目的尝试中可以获知当前位要与其他邻近的同奇偶性的位置进行比较

那么我们可以先按奇偶存储一个数的下标,当下次再遇到这个数的下标时根据k判断是否成立

比如对于 \(a=[1,2,1,2,1,2,1,2,1]\)\(n\) 为9,\(k\) 为5,从前遍历,先只看奇数

遍历到 \(a_3\) 时,在\(v[1]\)中存储了下标1,但是3与1号位本身不成对

遍历到 \(a_5\) 时,在\(v[1]\)中存储下标1,3,对于1和5成对,1和3也成对,那么答案需要减去2

遍历到 \(a_7\) 时,\(v[1]=[1,3,5]\),答案减去3

遍历到 \(a_9\) 时,\(v[1]=[1,3,5,7]\),9只与5成对,答案减1

2

对于基本的流程了解后,现在需要确定初始所有的答案,和成对的条件

我们引入对称中心的概念,记为c,可知 \(\frac{k+1}{2}<=c<=n-\frac{k+1}{2}+1\)

那么对于初始答案,有 \((n-\frac{k+1}{2}+1)-(\frac{k+1}{2})\) 个对称中心,每个对称中心对应有\(\frac{k-1}{2}\)对数字

相乘则为答案

对于成对的条件,记当前遍历到的位数为i,与之对应的成对下标为j,可知\(c=\frac{i+j}{2}\)

将c带入进上面的式子,就是\(k+1-i<=j<=2n-k+1-i\)

还有一个条件,\(i\)\(j\) 的距离不能大于 \(k\) ,即\(i-j>k-1\),

综上, \(max(k-i+1,i-k+1)\le j \le 2n-k+1-i\)

最后用lower_bound和upper_bound快速获取答案

代码

const int N = 2e5 + 10;
int n, k;
vector<int> v[N][2];void solve() {cin >> n >> k;  // 给ans赋初值int ans = (n - k + 1) * (k / 2);int x = 0;rep(ii, 1, n + 1) {// 对于每个x 看有没有能与之配对且符合条件的cin >> x;auto posl = lower_bound(alli(v[x][ii & 1]), max(k - ii + 1, ii - k + 1));auto posr = upper_bound(alli(v[x][ii & 1]), 2 * n - k - ii + 1);//cout << "ii:" << ii << "  posl:" << posl << "  posr:" << posr << endl;ans -= posr - posl;v[x][ii & 1].push_back(ii);}cout << ans << endl;
}

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

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

相关文章

数字设计--门控时钟与时钟切换

门控时钟(ICG) 使用门控时钟的原因 芯片功耗组成中,大部分是由时钟树消耗掉的。因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,并且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。…

ComfyUI进阶篇:ComfyUI核心节点(二)

ComfyUI核心节点(二) 前言: 学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每…

题目集7~8

由于个人原因,最后两次题目集未提交,对自己的放纵感到愧疚,后期的补练我也会抽出时间完成这两道题 经过分析,题目集7,是在前面的基础上加上了一个新概念:互斥开关,以及模拟一种受控窗帘, 在我的想法,互斥开关便可当作两个普通开关去完成电路,窗帘则是新增一个用电器。…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议…

4、flask-项目拆分

项目的拆分其实就是将app.py中的工作拆分开来、类似Django一样、每个项目都把路由模板和试图函数分开写 app.py # 路由 + 视图函数from flask import Blueprint from models import *#蓝图 # 创建蓝图对象 # 第一个参数:蓝图的名字 # 第二个参数:蓝图的包名 blue = Blueprin…

2-SAT 问题

2-SAT 问题 模型有 \(n\) 个布尔类型的变量 \(x_1, x_2, \ldots, x_n\),有 \(m\) 条限制形如 \(x_i \space [\operatorname{or}/\operatorname{and}]\space x_j=[1/0]\). 求一组符合要求的解。核心问题只需要考虑有没有解。 对于每个变量都只有两种取值:\(0/1\),那么把每…

坚果云与floccus实现Chrome书签国内跨设备、跨平台同步

本文介绍基于floccus插件与坚果云协同使用的方法,对浏览器的书签进行实时在线同步的操作~本文介绍基于floccus插件与坚果云协同使用的方法,对浏览器的书签进行实时在线同步的操作。在工作与学习中,我们时常希望在不同浏览器之间实现书签的同步;而一些传统的浏览器书签同步方…

性能监控调优

1.命令行工具 1.1 jps 查看系统JVM进程 jps [options] [hostid]optionhostid:省略则本机,监控远程需要安装jstatd1.2 jstat 查看JVM统计信息 jstat -[-t] [-h] [[]]option-t:加程序运行时间 [-h]:输出设定行数加表头信息 :查询间隔时间 count:查询总次数 结果:当ou上涨趋…

【第7个渗透靶机项目】 DerpNStink

Hack it 信息搜集 发现主机 nmap 192.168.0.17 -sS -sV -A -T5 全面扫描一下,有点有用信息访问一下但是没有用。 访问一下http服务查看源代码,发现有文件泄露下面还有个flag查看info.txt。<-- @stinky,确保使用本地 dns 更新您的主机文件,以便可以在新的 derpnstink 博客…

Linux运维工程师推荐学习的开发语言

前言:会开发的运维和不会开发的运维可以说是两个世界的运维。 个人推荐python和go,前者可以做自动化运维,后者可以深挖k8s;最近就不先演示运维服务技术的部署和架构搭建了,在深挖自动化运维,为了让现在的工作更加高效和便捷。如果有需要了解的运维服务技术,可以评论说出…

2、flask-run启动参数详解

app.py 这里 app.run(True, port=5001, host=0.0.0.0) from flask import Flask#创建flask应用对象 app = Flask(__name__)@app.route(/) # 路由 def hello_world(): # 视图函数return Hello World! # 响应给前端#添加路由和视图函数 @app.route(/index/) def index():…

从零学习的JAVAday1~day7

作为一个刚要迈入大二的预备程序员,已经学习过了c语言和c++的部分知识,在暑假期间满怀期待的开始Java的学习,希望一个暑假可以对Java的了解加深一些。 学习Java首先要学习windows电脑的cmd命令: 同时点击键盘上面的win+r键输入cmd即可进入默认的cmd面版,然后我们就可以输入…