题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次【竞技】。若一次操作中$a \leq b \leq 2a$,则称这次操作是【危险的】。一次竞技的【危险值】为其中【危险的】操作的次数。定义这个集合$S$的【危险值】(记作$\text{danger}(S)$)为:所有可能的竞技的【危险值】的最大值。设一个集合$S$初始为空集,维护以下操作:

1. 插入一个数$1 \leq x \leq 10^9$。

2. 删除一个(已有的)数$1 \leq x \leq 10^9$。

每次操作后,计算$\text{danger}(S)$。

解:code

对$x \in S$,定义$S$中比$x$小的数之和为

$$ f(x) = \sum_{a \in S, a < x} a. $$

定义$x$的等级为

$$ g(x) = \max_{a \in S, a < x} \{ g(a) \} + [2f(x)<x], $$

特别地,$\max \emptyset = 0$。

令$S$中的最高等级为

$$t = \max_{x \in S} \{ g(x) \}. $$

观察0:若$x < y$,则$ g(x) \leq g(y) \leq g(x)+1 $。

观察1:$\text{danger}(S)=|S|-t$。

证明:

先证$\text{danger}(S) \leq |S|-t$。令$T = \{ (x, g(x)): x \in S \}$,则$S$中的一次操作

【从$S$中取出两个元素$a$和$b$,并把$a+b$插入$S$。】

可对应为$T$的一次操作:

【从$T$中取出两个元素$(a, x)$和$(b, y)$,并把$(a+b, \max\{x,y\})$插入$T$。】

于是$S$的一次竞技,可对应$T$的一次竞技。

注意到,若$T$中的一次操作有$x = y$,则称这次操作是【不安全的】。$S$的任何一次不【危险的】操作,在$T$中都不是【不安全的】。$T$中一次竞技的【不安全值】为其中【不安全的】操作的次数。定义$T$的【不安全值】为所有可能的竞技的不安全值的最大值,记作$\text{unsafe}(T)$。则显然有$\text{danger}(S) \leq \text{unsafe}(T)$。

另一方面,$T$的任意一个可能的竞技中,都会导致竞技的结果剩下$(\sum_{a \in S} a, \max_{a \in S} \{ g(a) \})$,又至少有$t-1$次操作有$x \neq y$,从而$\text{unsafe}(T) \leq (|T|-1)-(t-1) = |T|-t$,即$\text{danger}(S) \leq |S|-t$。

再证$\text{danger}(S) \geq |S|-t$。我们只需给出一个竞技策略,即每次操作是从$S$中取出最小的两个元素$a$和$b$,并把$a+b$插入$S$。假设在某次操作$a$和$b$($a \leq b$)的不【危险的】,即$2a<b$,则$b$不曾被合并过(或者说$b$是$S$的原始元素),不然设$b = c+d$其中$c \leq d$,则$d \geq b/2 > a$,这说明$d$在$a$之前参与了某次合并操作,这与我们的竞技策略矛盾。这个竞技策略会导致,每种不同等级的元素中,恰好有一个(这个等级中某个最小的元素)参与了不【危险的】操作,从而这个竞技的【危险值】为$|S|-t$。故$\text{danger}(S) \geq |S|-t$。

综上,有$\text{danger}(S)=|S|-t$。

QED

因此,我们把$\text{danger}(S)$的计算转化为求$S$中元素的最高等级$t$。

观察2:$g(x) \leq \log_2 x + 1$,从而$t \leq \log_2 V+1$,其中$V = \max_{x \in S} \{x\}$。(数学归纳法)

我们将元素的取值范围划分为$[1, 2), [2, 4), [4, 8), \dots, [2^{k}, 2^{k+1}), \dots, [2^{29}, 2^{30})$。

观察3:在$[2^{k}, 2^{k+1})$范围内的至多存在一个$x \in [2^{k}, 2^{k+1})$,使得$g(y) < g(x)$对任意$y < x$成立。若存在这样的$x$,则$x$必为$[2^{k}, 2^{k+1})$中的最小值,且$2f(x)<x$。$t$等于满足这个条件的$x$的个数。

于是对每个$k = 0, 1, 2, \dots, 29$,维护容器$H[k]$,在插入(或删除)一个元素$x$时,若$x \in [2^{k}, 2^{k+1})$,则把$x$插入(或删除自)$H[k]$。对计算$\text{danger}(S)$,只需统计满足【观察3】的条件的$x$的个数。可用multiset来维护$H[k]$。

一共需要维护$O(\log V)$个multiset,从而时间复杂度为$O(Q \log Q \log V)$,其中$Q$为询问次数,$V$为所有元素的最大值。

CodeForces 1098D. Eels的更多相关文章

  1. Codeforces VP/补题小记 (持续填坑)

    Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ​ 考虑括号序列维护树的路径信息和,是将左括号看做 ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  2. 两种IO模式:Proactor与Reactor模式

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

  3. 【每日Scrum】第三天(4.13) TD学生助手Sprint1站立会议

    TD学生助手Sprint1站立会议(4.13) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 昨天完成了课程的增删改查功能 今天早晨静姐调整了下界面和配色,下午和宝月兄一起做 ...

  4. 笔记04 WPF对象引用

    转自:http://www.fx114.net/qa-261-90254.aspx 我们应该都知道,XAML是一种声明式语言,XAML的标签声明的就是对象.一个XAML标签会对应着一个对象,这个对象一 ...

  5. 每天一个linux命令(23):Linux 目录结构(转)

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  6. NFC 标签类型

    NFC 标签类型 Type 1:Type 1 Tag is based on ISO/IEC 14443A. This tag type is read and re-write capable. T ...

  7. 使用 Visual Studio Code 运行 C# 及 Java 程序

    背景 很多情况下,我只是想要编写一个非常简单的 C# 或者 Java 程序,只有几行代码,看看运行结果而已.虽说 Visual Studio / Eclipse / IntelliJ IDEA 功能强 ...

  8. 创建私有maven库

    在公司搭建私有maven库,我为了在本机做测试,我选择Sonatype nexus oss,在docker里面安装 1.Mac上安装docker 下载地址:https://github.com/boo ...

  9. Delphi快捷键大全

    Delphi快捷键大全 在过程.函数.事件内部, SHIFT+CTRL+向上的方向键 可跳跃到相应的过程.函数.事件的定义.相反,在过程.函数.事件的定义处,SHIFT+CTRL+向下的方向键 可跳跃 ...

  10. ubuntu 查看网卡 数据包处理 速度

    ubuntu 查看网卡 数据包处理 速度 sar -l 1 10 首先要安装sar .使用 apt-get install atsar sar 命令中的 "-l"參数是 net-i ...