https://vjudge.net/problem/TopCoder-13460

简要题意:给出 \(n\) 段从 \(1\) 到 \(n\) 编号的等长区间,保证区间的端点互不相同。区间可以选取其左端点或右端点值作为键值。求将区间按键值从小到大进行排序之后可能出现多少种不同的编号序列。对 \(10^9+7\) 取模。(\(n\le 5\times 10^5\))。

首先要知道序列不同当且仅当存在两编号在序列中的相对位置不同。

将区间按左端点升序排序,则其右端点也形成升序。尝试按排序后顺序进行增量,为求出答案自然想到记 \(f_i\) 为前 \(i\) 个区间任选键值排序能得到的序列的种数。

现在 \(f_i\) 不好求出,可以尝试枚举第 \(i\) 个区间选取了哪个键值。如果选取较大的键值,那么此时能得到的序列种数即为 \(f_{i-1}\),否则可以考虑再记 \(g_i\) 为第 \(i\) 个区间选取了左键值,前 \(i-1\) 个区间任选键值排序后能得到的序列的种数。

那么自然 \(f_i=f_{i-1}+g_{i}-\)(\(i\) 选左右键值时均能得到的序列的种数)。分析括号内要求的序列的性质,可以发现这样的序列必须能在 \(i\) 选左键值且排在最后一位的情况下被构造出,并且这也是充分条件。也就是说我们要求在 \(i\) 选左键值且排在最后一位的情况下能被构造出的序列的个数。

这就相当于求所有右端点在范围 \((l_i,r_i]\) 内的区间都选取左端点的情况下能够形成多少种序列。记该范围内右端点最靠左的区间为 \(j\),那么该问题相当于在 \(g_j\) 上插入了若干个端点,而每个端点都可能将 \(g_j\) 原有的某种序列分裂成若干种不同序列。

但我们运气较好,\(g_j\) 的所有序列都满足排在 \(j\) 后的区间选择了它的右端点从而位置固定,所以在 \(g_j\) 后插入的新端点同样位置固定,并不会导致原有序列的分裂,因而该问题的答案就是 \(g_j\),由此终于得到 \(f_i=f_{i-1}+g_i-g_j\)。

乘胜追击,我们继续思考 \(g_i\) 如何求得。继续尝试枚举区间 \(i-1\) 的选择。这里由于 \(i\) 选择了左端点,所以所有右端点在范围 \((l_i,r_i]\) 内的区间选取左右端点能得到的序列一定不同,所以枚举后只要进行简单加和。

如果区间 \(i-1\) 选择了左端点,那么与先前的分析相同,我们得到序列种数为 \(g_{i-1}\)。否则我们继续枚举区间 \(i-2\),直到因编号在 \([j,i)\) 的区间均选取右端点而导致要讨论区间 \(j-1\)。不过这时我们可以发现无需枚举,种数就是 \(f_{j-1}\)。

由此我们得到 \(g_i=f_{j-1}+\sum_{k=j}^{i-1}g_k\)。再结合 \(f_i=f_{i-1}+g_i-g_j\),在 \(i\) 的增量过程中维护数值单调不降的 \(j\),并在 \(i\) 与 \(j\) 的移动过程中顺便维护 \(\sum_{k=j}^{i-1}g_k\),就能 \(O(n)\) 求出 \(f\) 和 \(g\),而答案即为 \(f_n\)。

总时间复杂度 \(O(n+\text{Sort}(n))\),\(\text{Sort}(n)\) 为将 \(n\) 个数进行排序的复杂度。

[TopCoder2014Final]FrozenStandings 解法探究的更多相关文章

  1. 对背包问题(Knapsack Problem)的算法探究

    对背包问题(Knapsack Problem)的算法探究 至繁归于至简,这次自己仍然用尽可能易理解和阅读的解决方式. 1.问题说明: 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可 ...

  2. 探究"补阶乘大法的本质"——糖水不等式!

    废话不多说先来康一条例题: 证明: 下面给出题目的一种解法(我称之为"补阶乘大法"): 思考:为什么补上一个阶乘(准确说不是阶乘,是两个数阶乘的之商)项,放缩后再给去掉,就能达到我 ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  5. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  6. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

  7. [原] KVM 虚拟化原理探究 —— 目录

    KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...

  8. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  9. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

随机推荐

  1. JavaScript 数组 常用方法(二)

    写在前面:续接上篇 JavaScript 数组 常用方法 数组常用方法第二弹来了: some && every 描述: every()与some()方法都是JS中数组的迭代方法. so ...

  2. CAM 模板样式表

    视图 模板类型 模板子类型 类型 子类型 刀具类型 刀具子类型 加工工序 mill_planar FACE_MILLING_AREA 100 261     加工工序 mill_planar FACE ...

  3. Flask的环境配置

      Flask django是大而全,提供所有常用的功能 flask是小而精,只提供核心功能 环境配置 为了防止 django和 flask环境相互冲突,可以使用 虚拟环境分割开 pip instal ...

  4. [敏捷软工团队博客]Beta设计和计划

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta设计和计划 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Beta ...

  5. [调试笔记] 晚测5 T1 容易题

    众所周知,sbwzx在考试一结束就嚷嚷T1是个sb题.那他为什么调了2小时才调出来呢?快和小编一起看看吧. Sb题:指除了sbwzx别人都能做出来的题 1.CE:震惊!sbwzx竟然连map都不会用, ...

  6. 零基础学习C语言字符串操作总结大全

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  7. 21.10.18 test

    可可大神出题,四款有趣的游戏推荐,第四个好玩/se T1 loopers \(\color{green}{100}\) 考虑钦定 \(a_1,a_i\) 的位置,固定左边一坨,那么剩下的一坨的 \(\ ...

  8. MyBatis源码分析(六):Spring整合分析

    一.Mybatis-Spring源码结构 二.Myabtis交给Spring管理的组件 1. dataSource 数据源 配置一个数据源,只要是实现了javax.sql.DataSource接口就可 ...

  9. Hadoop的HA(ZooKeeper)安装与部署

    非HA的安装步骤 https://www.cnblogs.com/live41/p/15467263.html 一.部署设定 1.服务器 c1   192.168.100.105    zk.name ...

  10. yum history使用详解(某次为解决误卸载软件的回退实验)

    [root@localhost ~]# yum history list #查看历史 Loaded plugins: fastestmirror ID | Command line | Date an ...