【HDU6635】Nonsense Time
题目大意:给定一个长度为 N 的序列,开始时所有的位置都不可用,每经过一个时间单位,都会有一个位置被激活。现给定激活顺序的序列,求每次激活之后全局的最长上升子序列的长度,保证数据随机。
题解:
引理:数据随机的情况下,一个长度为 \(N\) 的序列的最长上升子序列的期望长度为 \(O(\sqrt n)\)。(暂时不会证明qaq)
发现若正序考虑,判断每次被激活位置的值是否对当前全局最优解有贡献这一操作所消耗的复杂度过高,无法接受。考虑时间倒流,即:初始时所有位置的值均被激活,每次会有一个位置的值无效。根据引理可知,\(i\) 个数字的 \(LIS\) 的期望值为 \(O(\sqrt i)\),即:每 \(\sqrt n\) 个数字无效时,全局 \(LIS\) 才会减少 1。因此,只需要判断每次无效的数是否在全局 \(LIS\) 中,若存在,则暴力重构全局最优解,否则直接输出答案即可。时间复杂度为 \(O(n\sqrt nlogn)\)。
代码如下
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
vector<int> a(n), melt(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> melt[i];
melt[i]--;
}
vector<bool> frozen(n), book(n);
vector<int> ans(n), dp(n), pos(n);
auto RunLIS = [&]() {
fill(dp.begin(), dp.end(), 1e9);
fill(book.begin(), book.end(), 0);
fill(pos.begin(), pos.end(), -1);
int r = 0;
for (int i = 0; i < n; i++) {
if (frozen[i] == 0) {
int id = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin();
if (dp[id] == 1e9) {
r = max(r, id);
}
dp[id] = a[i], pos[i] = id;
}
}
for (int i = n - 1, now = 1e9, len = r; i >= 0; i--) {
if (len < 0) break;
if (pos[i] == len && a[i] < now) {
now = a[i];
len--;
book[i] = 1;
}
}
return r + 1;
};
int ret = RunLIS();
for (int i = n - 1; i >= 0; i--) {
ans[i] = ret;
frozen[melt[i]] = 1;
if (book[melt[i]] == 1) {
ret = RunLIS();
}
}
cout << ans[0];
for (int i = 1; i < n; i++) {
cout << " " << ans[i];
}
cout << endl;
}
return 0;
}
【HDU6635】Nonsense Time的更多相关文章
- 【HDOJ6635】Nonsense Time(时间倒流,lis)
题意:给定n个数的数列,第i个数为a[i],刚开始所有位置都处于禁用状态,第i次之后位置p[i]变为可用,求每次变化后的lis长度 n,a[i],p[i]<=5e4 保证a[i],p[i]均为随 ...
- 【POJ3461】【KMP】Oulipo
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...
- [转]Git教程【译】
[转]Git教程[译] http://www.cnblogs.com/zhangjing230/archive/2012/05/09/2489745.html 原文出处:http://www.voge ...
- 【LaTeX】E喵的LaTeX新手入门教程(4)图表
这里说的不是用LaTeX画图,而是插入已经画好的图片..想看画图可以把滚动条拉到底.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础 ...
- 【译】Android API 规范
[译]Android API 规范 译者按: 修改R代码遇到Lint tool的报错,搜到了这篇文档,aosp仓库地址:Android API Guidelines. 58e9b5f Project ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
随机推荐
- Python爬虫学习==>第五章:爬虫常用库的安装
学习目的: 爬虫有请求库(request.selenium).解析库.存储库(MongoDB.Redis).工具库,此节学习安装常用库的安装 正式步骤 Step1:urllib和re库 这两个库在安装 ...
- SQL常见面试题(学生表_课程表_总表)
问题描述: 为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所属单位.学员年龄 C (C#,CN ) C#,CN 分别代表课程编号 ...
- win10相机打不开,显示错误代码0xA00F4246(0x800706D9)
有时我们在不知道什么情况下电脑便会变成这个样子,当我们以为是驱动问题的时候,或许我们可以使用下面的办法解决这个问题 方法: 1.WIN键+R打开命令端,输入regedit运行 2.进入 计算机\HKE ...
- Vim常用操作集合
基本上 vi/vim 共分为三种模式,分别是一般命令模式(Command mode),编辑模式(Insert mode)和命令行模式(Last line mode). 命令模式: 用户刚刚启动 vi/ ...
- Python面试简介及并行并发
今天的分享内容大体如下: 一. 面试 1. 什么是面试 2. 优秀的面试 二. Python综述 1. Python设计哲学及版本变迁 2. Python发展现状及其他语言使用场景 3. GIL 4. ...
- Ubuntu下c程序运行原理
运行环境: 1.Vitural box下安装Ubuntu虚拟机 2.编译运行工具:gcc 3.编辑器:vim 主要过程: 1.利用vim编辑hello.c 2.编译和执行 (1)预处理阶段:使用 -E ...
- python 将分词结果写入txt文件
首先我运用的分词工具是结巴分词 import jieba 然后调用jieba.cut( ) 但是jieba.cut 返回的是一个generator的迭代器 他可以显示分词结果 但是无法将结果写入t ...
- json字符串转成 json对象 json对象转换成java对象
import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...
- NIKKEI Programming Contest 2019-2 Task E. Non-triangular Triplets
$\require{enclose}$ 必要条件 一方面 $\sum_{i=1}^{N}(a_i + b_i) \le \sum_{i=1}^{N} c_i \implies 2\sum_{i=1}^ ...
- P1828香甜的黄油
这是一道关于最短路的绿题. 题目给出一些农场,每个农场有奶牛,农场与农场之间存在边,要使所有奶牛到达其中一个农场的总距离最短,输出他们到达这个农场的距离.首先我想到了最小生成树,但我发现其实并不是,因 ...