题目简述:对一个非空正整数(可重)集合$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$为所有元素的最大值。

转载于:https://www.cnblogs.com/TinyWong/p/10352896.html

CodeForces 1098D. Eels相关推荐

  1. Codeforces 1089D Eels (看题解)

    Eels 感觉想不出来这种东西.. 题解讲的很清楚啦. 我好lj啊. https://codeforces.com/blog/entry/64331 #include<bits/stdc++.h ...

  2. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  3. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  4. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  5. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  6. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  7. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  8. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  9. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

最新文章

  1. 【Java】基本二叉搜索树讲解
  2. struts2处理请求流程详解
  3. 从@EnableRedisHttpSession谈谈Spring Session实现原理
  4. android studio 动画效果图,Android Studio如何动画移动视图?
  5. Codeforces Round #245 (Div. 1) E. Points and Segments 欧拉回路 + 建模
  6. 浅析C++的三大循环-以100以内的质数求解为例
  7. android初步ui线程案例,android – 它是一个bug还是一个功能?在某些情况下,可以从未在UI线程上运行的任务访问UI线程...
  8. JavaScript tab页
  9. 如何查看一个组件的 classid是多少_如何快速查看胎压?胎压多少才正常?带您全面了解爱车的轮胎...
  10. [转]细说Redis监控和告警
  11. RSA加密算法【手把手解释】
  12. linux方舟部落日志显示攻击者,r7800日志显示被攻击
  13. 如何查计算机的网络速度,电脑怎么查网速?教你精准测速的方法
  14. 百度离线地图示例之一:地图展示
  15. android 个人云存储,个人云储存appv1.3
  16. 2018年​最酷的APP手机UI设计趋势
  17. Zookeeper 3.5.7学习记录(一)——集群的坑
  18. arm9+linux s3c2440 触摸屏驱动移植
  19. 啊哈c语言一起来找茬答案,啊哈少儿编程网-啊哈C【第三章】来了! 第2节-【说几遍就几遍】 - ahalei.com...
  20. IAR获取固件编译的时间

热门文章

  1. python中bytearray函数_Python内置函数—bytearray
  2. sql-DbContext
  3. 教会你如何编写makefile文件
  4. Java Web之Servlet的三大常用作用域对象及其使用方法
  5. Python3爬取淘宝网商品数据!
  6. W nDOwS多系统安装,IVB新平台Wndows XP系统安装教程.doc
  7. inventor如何钣金出弧面_Inventor钣金造型教程
  8. 解决win10下栏不显示电池电量图标问题
  9. jquery跳转、刷新页面大全
  10. MTU and MSS