首页 > 其他分享 >CF1810H Last Number

CF1810H Last Number

时间:2023-06-21 12:23:33浏览次数:38  
标签:dots 10 CF1810H le Last Number 生成 集合 操作

大难题,但是非常的有意思。思路来自 \(\color{black}\text{艾}\color{red}\text{利克斯·伟}\)。补充了一点小细节。

题意

对于一个 可重 集合 \(S\),初始为 \(\{1 \dots n\}\),执行以下操作:删除集合中的最大、最小元素 \(S_{min}, S_{max}\),加入 \(S_{max} - S_{min}\)。最终集合只剩下一个元素,输出这个元素。

给定 \(T\) 组 \(n\),分别输出答案,\(1 \le T \le 10^5, 1 \le n \le 10^9\)。

做法

首先观察题目给出的操作序列,容易发现这些操作是分为两部分的。记第 \(i\) 次操作加入的是 \(a_i - b_i\)。存在一个 \(p\) 使得 \(\forall 1 \le i < p\),\(a_i > 2b_i\),并且 \(a_p \le 2b_p\)。那么 \(\forall 1 \le i \le p, b_i = i, a_{i-1} - a_i \in \{0, 1\}\),看起来是很可以做的。

这部分先按下不表,转而考察 \(p < i \le n-1\) 的情况。记第 \(p\) 次操作以后的可重集合是 \(S'\),同时也记它为集合排序后的序列。那么容易得出此时的每次操作以后,新集合的最小值一定是刚加入的数。这个直觉的来源是,加入的数整体而言在不断变小。事实上可以证明,由于最大值不减,所以每两轮,加入的数一定不减;而第 \(p\) 和 \(p+1\) 次操作都保证生成的数是集合最小值——所以接下来的过程中它始终保持最小。有了这个结论,我们可以优美地描述后半部分操作:\(Ans = S'_2 - (S'_3 - (S'_4 - \dots (S'_{n-p} - S'_1)\dots))\)。

接下来,考虑前半部分操作。首先,\(b_i = i, a_{i-1} - a_i \in \{0, 1\}\) 告诉我们,每一次生成的数都会变小 \(1\) 或 \(2\)。那么从大到小扫描值域的过程中,每次碰到的数都要么有一个要么有两个。一旦生成了一个数,这个数和它后面的所有数的个数都确定下来了。所以考虑依次确定这些数的个数。记 \(d_i = a_{i-1}-a_i\),则若 \(d_i = 0\),被确定的数是 \(a_i - i\) 有两个;否则被确定的是 \(a_i - i\) 有两个,\(a_i - i + 1\) 有一个。考虑维护 \(d\) 而不是 \(a\)。那么相当于我扫描到一个 \(0\) 就加入 \(10\),扫描到一个 \(1\) 就加入 \(110\)。考虑 \(d\) 序列的前几项:

\[0/10/11010/1101101011010/... \]

你可以把生成 \(d\) 的过程分段化,设 \(Q_i\) 表示第 \(i\) 阶段生成的串,那么它前缀依次拼接得到的就是 \(d\) 序列。\(Q_{i+1}\) 是由 \(Q_i\) 中所有 \(0\) 替换成 \(10\),所有 \(1\) 替换成 \(110\) 得到的。生成这种东西,不要依次递推,而是考虑从开头插入操作。具体地,记 \(f_{0/1, i}\) 表示一开始为 \(0/1\) 进行 \(i\) 次迭代得到的东西,那么 \(Q_i = f_{0, i}\)。则存在递推:

\[\begin{cases} f_{0, i} = f_{1, i-1} + f_{0, i-1}\\ f_{1, i} = f_{1, i-1} + f_{1, i-1} + f_{0, i-1} \end{cases} \]

那么我们就获得了一种优雅的方法生成 \(Q\),可以借此获得 \(d\) 的前缀信息。

接下来,只需要结合上面对于后半部分操作的结论即可。容易得出,考虑我们在第 \(p\) 次操作结束后生成的 \(d\) 所对应的 \(a\) 序列。则上述的 \(S'_1 = a_p - p \le p\),而 \(S'_i = a_{n-i+1}(2 \le i \le n-p)\)。所以:

\[\begin{align*} Ans &= a_{n-1} - (a_{n-2} - (a_{n-3} - \dots (a_{p+1} - (a_p - p))\dots))\\ &= (-1)^{n-p}p +\sum\limits_{i = p}^{n-1} (-1)^{n-i+1}a_i\\ &= \begin{cases} p-s_{n-1}-s_{n−3}-\dots-sp+1p−sn−1​−sn−3​−\dots−sp+1​。 \end{cases} \end{align*} \]

标签:dots,10,CF1810H,le,Last,Number,生成,集合,操作
From: https://www.cnblogs.com/kyeecccccc/p/17495960.html

相关文章

  • elasticsearch 语句
    #测试分词器GET/_analyze{"analyzer":"ik_max_word","text":"泰裤辣,萌萌哒"}#创建索引库和映射PUT/student{"mappings":{"properties":{"name":{"type":"te......
  • MYSQL 执行update语句时报错: The total number of locks exceeds the lock table size
    由于数据量较大导致报错:‘’Thetotalnumberoflocksexceedsthelocktablesize‘’。这句话翻译过来大概是这个意思:总数已经超过锁定表的大小。解决办法:输入查询:showvariableslike"%_buffer%";找到innodb_buffer_pool_size对应的值默认为8388608也就是8兆。我们将其设置......
  • PAT (Advanced Level)_1100 Mars Numbers (20分)(C++_模拟)
    PeopleonMarscounttheirnumberswithbase13:ZeroonEarthiscalled"tret"onMars.Thenumbers1to12onEarthiscalled"jan,feb,mar,apr,may,jun,jly,aug,sep,oct,nov,dec"onMars,respectively.Forthenexthigherdigi......
  • last_load_time和last_active_time的选择
    我们平台在查找使用全表扫描执行计划的SQL时,发现有些应用跑过逻辑的SQL,确认用的全表扫,但是未能实时的检索到,于是,看下用的SQL,SELECTs.sql_text,P.OBJECT_OWNER,P.SQL_ID,P.OPERATION,P.OPTIONS,S.LAST_LOAD_TIME,ROW_NUMBER()OVER(PARTI......
  • 下载-elasticsearch
    下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearchELK的主版本号需要统一:ElasticSearch-5.2+Logstash-5.2+Kibana-5.2安装说明  1.在安装Elasticsearch之前,需安装并配置好JDK,设置好环境变量 $JAVA_HOMEElasticsearch5需要Java8......
  • P-smoothnumber
    [ABC300G]P-smoothnumber上来看到题就可以爆搜了。状态是\(f[p][n]\)表示现在再在处理第\(p\)小的素数,剩余\(n\)。然后转移是\(f[n][p]=f[n/prime[p]][p]+f[n][p-1]\),分别表示除掉一个\(prime\),转到下一个\(prime\),这样做显然是对的,因为如果一个数在范围内,那么这样除只......
  • 【ElasticSearch】索引(添加)
    【ElasticSearch】索引(添加)RESTAPIPUT/myindex{"settings":{"index":{"number_of_shards":3,"number_of_replicas":3}},"mappings":{"properties":{"......
  • Educational Codeforces Round 150 (Rated for Div. 2) C. Ranom Numbers
    #include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=2e5+10;typedeflonglongll;//记录每个字母的最前面的位置和最后面的位置intFast[5],End[5];strings,c;llres=-0x3......
  • oracle中rownum和row_number()
     oracle中rownum和row_number() row_number()over(partitionbycol1orderbycol2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进......
  • 使用 Easysearch 还原 Elasticsearch 快照数据
    本文主要验证Elasticsearch快照在Easysearch中进行数据恢复。准备测试数据索引别名模版生命周期策略创建快照PUT/_snapshot/my_backup{"type":"fs","settings":{"location":"/infini/test/es_backup"}}PUT/_snapshot/my_bac......