看到这道题,网上没有中文版的官方题解,于是就自己翻译了一遍。

  不是机器翻译,是一个字一个字纯手翻译的,如果有错误欢迎指正。

  

  比如我们有一张卡片,三个参数分别是 a1 = 4, b1 = 2, c1 = 3. 方便起见,我们令 p = q = r = 5.

  考虑什么样的卡片能够击败这张. 我们可以固定一个参数c,来观察对于不同的c,有什么特殊的性质:

 

  注意在第c个坐标系中,坐标为(a,b)的绿色方格代表一张卡片 (a, b, c) 可以击败我们这张卡片 (4, 2, 3). 因此,对于所有c个坐标系中的绿色方格总数就是能击败这张卡片卡片总数。这种表示方法很重要, 因为我们可以简单地考虑更多的卡片.比如我们有这样一张卡片 a2 = 2, b2 = 3, c2 = 4:

 

  现在,考虑我们想同时击败这两张卡片时是什么情况?显然,我们只需要把对应的两个坐标系求交集即可。

 

  记住,我们只需要算得每个坐标系中的绿色方格数量。

  事实证明,我们很难直接计算出绿色方格的数量。相反,计算非绿色的方格数量是更加可行的,这时我们只需要将其从所有pqr坐标系中减去即可。

  怎么做?我们要利用这些网格的一些优美的性质。

  首先,对于每个特定的卡片(ai, bi, ci),所有的 1 到 ci 坐标系是相同的, 并且所有的 ci + 1 到 r 的坐标系也是相同的。这就是说我们可以避免大量冗余计算,而且仅当状态变化时我们才需要进行更新。

  其次,如果一个方格(a, b)对于一个固定的c不是绿色的, 那么对于相同的c,满足a' ≤ a, b' ≤ b的所有方格(a', b') 也不是绿色的。这就意味着我们可以用一个数组u1, u2, u3, ...代替c相同的坐标系,其中ua表示所有非绿的(a, b)中最大的b. 另外, u1 ≥ u2 ≥ u3 ≥ ... ≥ up.

  再其次,对于每张卡片,每一个特定的c,u数组中最多只有两种不同的取值

  最后,对于每张卡片,当c<c’时,c坐标系的u数组中任何一个值ui都不小于c’ 坐标系的u’数组中的对应取值u’i。

  尽管这些性质都是显而易见容易证明的, 但会成为我们解决问题的良方。

  我们从c = r 到 c = 1枚举c. 假设我们维护一个初始全零的数组s. 将用来保存对于每个c的非绿方格总数。

  我们首先对于每个坐标系进行更新. 对于每张卡片, 每个isi 取max(si, ui)。

  当然,对于每个坐标系求出答案需要O(np)的时间复杂度, 这太慢了。 解决这个问题,我们可以把s数组建成线段树。现在,对于每一个卡片i,我们只需要将s1, s2, s3, ..., sai 设置为max(sj, bi) 。

  因为s数组实际上是一组u的最大值,这些是不被其他性质所增加的,所以s数组一直是不增加的。所以这些更新很容易做; 我们把sk, sk + 1, sk + 2, ..., sai 设置为bik是最小的满足bi ≥ sk的数。我们可以二分找到k, 线段树上二分可以做到O(log p)的复杂度。O(log^2 p)的复杂度可能通过这道题有些困难。

  执行上述操作,我们就能在O(nlog p)的时间复杂度之内生成c=r时的相应s数组。使用线段树我们就能够随时统计s数组总和,这就能允许我们统计所有非绿色格子的数量。

  现在我们将从c=r向c=1枚举c,并观察那个网格发生了变化(开始的时候对卡片按照c参数排序,之后双指针扫描就可以了) 所有坐标系网格都可以按照之前的方法更新。当坐标系发生变化时,好在我们有第四条性质,保证ui不会减少,只会变得更大。所以,我们只能更新两个范围:将s1, s2, s3, ..., sai 更新为 r 以及sai + 1, sa2 + 1, sai + 3, ..., sp 更新为 max(sj, bi). 前者更新颇为简单, 后者就需要像之前一样用二分查找完成.

  当我们更新完每一个特定的c表示的坐标系时,得到了这个范围的权值和,然后再倒着枚举c,这样直到我们枚举到1。我们将在每个c坐标系中找到非绿色方格的总数,从中我们就可以得出绿色的方格总数,这样就可以得到答案。

  对卡片排序花费 O(nlogn)的时间复杂度, 建出线段树s花费O(p) 的时间复杂度,并且有O(n)个更新操作每个花费O(log p)的时间复杂度,枚举花费O(r)的时间复杂度。因此最终的运行时间复杂度是O(n(log n + log p)+p+r) ,这样的复杂度足以通过此题。

  题解也可以修改一下可以通过 p, q, r ≤ 10^9的数据;可是,并没有出现这样的要求,因为思想都是一样的,只不过增加了不少编程复杂度,如果有意,可以自行实现一下。

CF815D Karen and Cards 官方题解翻译的更多相关文章

  1. CF815D Karen and Cards

    CF815D Karen and Cards 固定一维c,然后(a,b)看成坐标,矩形区域求交 1.Segment tree Beats! 2.改成不合法的区域就是求并,c反向枚举,区域只增不减且完全 ...

  2. 【CF815D】Karen and Cards 单调栈+扫描线

    [CF815D]Karen and Cards 题意:一张卡片有三个属性a,b,c,其上限分别为A,B,C,现在有n张卡片,定义一张卡片能打败另一张卡片当且仅当它的至少两项属性要严格大于另一张的对应属 ...

  3. MariaDB官方手册翻译

    MariaDB官方手册 翻译:create database语句(已提交到MariaDB官方手册) 翻译:rename table语句(已提交到MariaDB官方手册) 翻译:alter table语 ...

  4. 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)

    ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...

  5. 虎符ctf-MISC-奇怪的组织(看完官方题解,找到了)

    一道取证题,一整场比赛,基本就死磕了这一题 写的很乱,因为当时的思维就是那么乱,完全没有注意到出题人的提示, 还没做出来,没有找到关键key 那个人的real name 文档:虎符.note链接:ht ...

  6. 【LGR-070】洛谷 3 月月赛-官方题解

    本次免费为大家提供[LGR-070]洛谷 3 月月赛的官方题解,点个赞再走呗! 代码就不上了,大家可以到别的博客上去找找!希望这篇博客能对你有所帮助!

  7. Genymotion中文手册(官方用户手册翻译)

    目录 1.概述    2 2.特点    2 2.1最擅长于虚拟Android    2 2.2高可控性    2 2.3管理你的设备    2 2.4从Eclipse中开启虚拟设备    3 3.要 ...

  8. HTML5之appcache语法理解/HTML5应用程序缓存/manifest缓存文件官方用法翻译

    习惯性的贴几个参考链接: W3School-HTML 5 应用程序缓存 官方 MDN window.applicationCache 接口文档 官方 MDN 用法示例 看所有的教程不如直接看最原始的官 ...

  9. Codeforces Round #460 D. Karen and Cards

    Description Karen just got home from the supermarket, and is getting ready to go to sleep. After tak ...

随机推荐

  1. Node.js 内置模块fs(文件系统)

    fs模块的三个常用方法 1.fs.readFile() -- 读文件 2.fs.writeFile() -- 写文件 3.fa.stat() -- 查看文件信息 fs模块不同于其它模块的地方是它有异步 ...

  2. Oracle Java SE 组件概念图

    JDK1.8 组件概念图

  3. assembly x86(nasm)串比较

    预留字符串口令,输入口令串与预留密码串比较.若匹配则显示“MATCH!CONGRATULATION”,否则显示“NOMATCH!”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输 ...

  4. ERROR: Could not connect to lockdownd, error code -19 -20

    执行命令行 brew install libimobiledevice --HEAD

  5. Codeforces 1132D(二分模拟)

    要点 二分显然,关键在于怎么判断 题解方法:开k个队列代表每个时间有哪些电脑会挂掉,这部分O(n)预处理一下,之后扫一遍时间,每个时间点贪心选取最靠前的会挂的电脑未雨绸缪给它充电,然后看看充电以后要不 ...

  6. Connected Components? Codeforces - 920E || 洛谷 P3452 &&bzoj1098 [POI2007]BIU-Offices

    https://codeforces.com/contest/920/problem/E https://www.luogu.org/problemnew/show/P3452 https://www ...

  7. django 模板语言的注释操作

    Django在HTML里面书写的模板语言不能使用这种方法注释,这样注释实际依然有效 <!--{% if text %}--> 第一种使用模板标签{% comment %}注释,这是块注释 ...

  8. c指针参数常见错误

    参数的地址是可以修改的,修改后的地址是不可能传回给调用处的指针变量.也就是说,可以修改参数地址所指的单元的值,这是可以传回到调用处的变量里面的. #include <stdio.h> #i ...

  9. Spark Mllib里如何将trainDara训练数据文件里第一行是字段名不是数据给删除掉(图文详解)

    不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第13章 使用决策树二元分类算法来预测分类StumbleUpon数据集

  10. 20 P2678 跳石头

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...