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

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

  

  比如我们有一张卡片,三个参数分别是 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. vue-cli 【flexible】屏幕字体自适应布局及配置

    0.前言: 很多前端小伙伴在写页面尤其是移动端页面的时候,要求页面布局以及字体大小随屏幕宽度变化而随之按比例自适应[注:非响应式],那么,在vue-cli脚手架中应该如何去实现呢? 1.安装flexi ...

  2. 分布式通信-tcp/ip 广播

    服务端 /** * 广播 */ public class MulticastServer { public static void main(String[] args) { try { //地址是2 ...

  3. python操作rabbitmq实现消息过滤接收

    目标: 代码实现(direct_product.py) # __author__ = 'STEVEN' import pika,sys #开启socket connection = pika.Bloc ...

  4. IMG 的alt和title的区别(转自 百度空间--路云的世界)

    图片标签img中alt与title的区别 图片标签img中alt与title的区别 可能很多新手在做站内优化的时候,不明白图片标签img中alt与title的区别,今天为大家说一下其中的区别. 大家可 ...

  5. POJ-1181-食物链

    链接:https://vjudge.net/problem/POJ-1182 题意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1 ...

  6. 洛谷P2470||bzoj1068 [SCOI2007]压缩

    bzoj1068 洛谷P2470 区间dp入门题?只要注意到每个M“管辖”的区间互不相交即可 错误记录:有点小坑,比如aaaacaaaac最优解为aRRcR(意会坑在哪里),踩了一次 #include ...

  7. JAVA常用知识总结(八)——计算机网络

    GET 和 POST 的区别? get参数通过url传递,post放在request body中. get请求在url中传递的参数是有长度限制的,而post没有. get比post更不安全,因为参数直 ...

  8. 用redis实现简单的队列

    在工作中,时常会有用到队列的场景,比较常见的用rabbitMQ这些专业的组件,官网地址是:http://www.rabbitmq.com,重要的是官方有.net的客户端,但是如果对rabbitMQ不熟 ...

  9. JS排序--快速排序

    用 JavaScript 实现快速排序代码如下: /* * @author liphong * @data 2019/02/24 */ var arr = []; // 需要被排序数组 /* * 分离 ...

  10. while嵌套应用二:九九乘法表

    __author__ = 'zht' #!/usr/bin/env python # -*- coding: utf-8 -*- ''' #努力学习每一天 ''' #while嵌套应用二:九九乘法表 ...