【HDU5748】Bellovin
Description











andhe define a function on the sequence --





























,where

isthe length of the longest increasing subsequence ending with

. Peter would like to find another sequence











insuch a manner that














equalsto














.Among all the possible sequences consisting of only positive integers, Peter wants the lexicographically smallest one.
The sequence











islexicographically smaller than sequence











,if there is such number
from
to
,that




for 



and 



.Input
,indicating the number of test cases. For each test case:
The first contains an integer











--the length of the sequence. The second line contains
integers 



















.Output
integers 


















denotingthe lexicographically smallest sequence.
Sample Input
3
1
10
5
5 4 3 2 1
3
1 3 5
Sample Output
1
1 1 1 1 1
1 2 3
【题解】
这题就是要求最长不下降子序列。
不同的是,它不是要求你求出来最长不下降子序列的各个值具体是什么。
它要求的是以ai结尾的最长不下降子序列的长度f[i].
但是这题的坑点在于。它不让你用那么方便的n^2算法。要用nlogn算法才行。所以就去找咯。
原来的f[i]要改一下意思了。变成长度为i的最长上升(严格上升)序列的最后一个元素的最小值是啥。
一开始len = 1;f[1] = a1;
然后for i = 2->n
if (a[i] > f[len]) //这个很好理解吧?就是如果大于长度为len的最后一个元素.则最长XX的长度递增。
{
len++;
f[len] = a[i]; //然后把新的元素接上去就好
直接输出len.表示以a[i]结尾的最长不下降子序列的长度为len;
}
else
{
找到一个k
f[k-1]<a[i]<=f[k];
因为a[i] <= f[k]且f[k-1]<a[i] 则说明其可以代替f[k]成为一个更小的f[k]'。
那么就让f[k] = a[i]就好;
这个k可以用二分查找找到(鬼才想去写这个二分查找。跟屎一样难写!)
所以我们用STL解决(就是algorithm这个头文件里的东西。)
它叫。我看下我能不能默下来lower__count??
我看下。
哦,错了
是lower_bound(f+1,f+1+len,a[i])-f;
你没看错最后面减去了一个数组
然后前面就是类似sort(a+1,a+1+len);
表示从1..len找到这样的k;
然后f[k] = a[i];
然后输出k.表示以a[i]为结尾的最长不下降子序列的长度为k;
}
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; int t, n, a[100001], f[100001], last = 1, ans[100001]; int main()
{
scanf("%d", &t);
for (int mm = 1; mm <= t; mm++)
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)//读入数据
scanf("%d", &a[i]);
f[1] = a[1];//最长不下降子序列长度为1的最小结尾元素一开始就是a[1]
ans[1] = 1;//没用的。。别管
printf("1");//表示以a1为结尾的最长不下降子序列的长度为1
last = 1;
for (int i = 2; i <= n; i++)
{
if (f[last] < a[i])//因为更新了最长不下降子序列的长度
{
last++;
printf(" %d", last);//所以以其结尾的元素的长度为last;
f[last] = a[i];
}
else
{
int pos = lower_bound(f + 1, f + 1 + last, a[i]) - f;//找到合适的K值
f[pos] = a[i];//放在这个位置
printf(" %d", pos);//输出它的长度、即以a[i]为结尾的最长不下降子序列的长度。
}
}
printf("\n");
}
return 0;
}
【HDU5748】Bellovin的更多相关文章
- 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 ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- 洛谷 P2026 求一次函数解析式
P2026 求一次函数解析式 题目背景 做数学寒假作业的怨念…… 题目描述 给定两个整点的坐标,求它们所在直线的函数解析式(一次函数). 输入输出格式 输入格式: 输入共两行. 第一行有两个整数x1, ...
- OGRE之跳出漫长的编译等待
当你新建一个OGRE项目时是否发现那漫长的编译等待时间差点儿让你崩溃? 当你改动代码不断进行调试时是否由于那漫长的编译等待而让你烦恼? 假设是,那么请继续往下看,您将受益匪浅. ----------- ...
- 96.udp通信
运行截图 客户端 创建客户端套接字,用于创建UDP通信 SOCKET socket_client; 创建UDP通信 socket_client = socket(AF_INET, SOCK_DGRAM ...
- Android .getRGB得到是负数,解决方案
情景:ava.awt.color 下面的getRGB怎么得出的是负数???本来想通过getRGB得到一个整数,在另外的一个部分在根据这个整数构件一个color,因为参数规定只能能传整数!!!color ...
- golang recover
package main import "fmt" func divideByZero() { // Use this deferred function to handle er ...
- ajax实现简单的点击左侧菜单,右侧加载不同网页
实现:ajax实现点击左侧菜单,右侧加载不同网页(在整个页面无刷新的情况下实现右侧局部刷新,用到ajax注意需要在服务器环境下运行,从HBuilder自带的服务器中打开浏览效果即可) 原理:ajax的 ...
- 关于腾讯云server使用FTP具体配置教程
本文文件夹:-------------------------------------------------------- [-] 腾讯云server介绍 关于腾讯云server使用感受 作为开发人 ...
- DC针对pipeline的优化
set_optimize_register true compile -ultra 调整pipleline各级的组合逻辑,使得各级组合逻辑的延迟跟接近 对非pipeline进行优化: regi ...
- unmapping error
否则,会映射一个Getch的器件,就会报unmapping 的error
- Oracle中暂时表空间的清理
作者:iamlaosong Oracle暂时表空间主要用来做查询和存放一些缓冲区数据. 暂时表空间消耗的主要原因是须要对查询的中间结果进行排序.暂时表空间的主要作用: 索引create或rebuild ...