BestCoder Round #84 1002 hdu 5748 最长上升子序列
来源:互联网 发布:象棋软件ios 编辑:程序博客网 时间:2024/04/30 22:58
链接:戳这里
Bellovin
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Problem Description
Peter has a sequence a1,a2,...,an and he define a function on the sequence -- F(a1,a2,...,an)=(f1,f2,...,fn), where fi is the length of the longest increasing subsequence ending with ai.
Peter would like to find another sequence b1,b2,...,bn in such a manner that F(a1,a2,...,an) equals to F(b1,b2,...,bn). Among all the possible sequences consisting of only positive integers, Peter wants the lexicographically smallest one.
The sequence a1,a2,...,an is lexicographically smaller than sequence b1,b2,...,bn, if there is such number i from 1 to n, that ak=bk for 1≤k<i and ai<bi.
Input
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
The first contains an integer n (1≤n≤100000) -- the length of the sequence. The second line contains n integers a1,a2,...,an (1≤ai≤109).
Output
For each test case, output n integers b1,b2,...,bn (1≤bi≤109) denoting the 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
思路:
在求严格最长上升子序列的时候更新答案就可以了
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include <ctime>#include<queue>#include<set>#include<map>#include<stack>#include<iomanip>#include<cmath>#define mst(ss,b) memset((ss),(b),sizeof(ss))#define maxn 0x3f3f3f3f#define MAX 1000100///#pragma comment(linker, "/STACK:102400000,102400000")typedef long long ll;typedef unsigned long long ull;#define INF (1ll<<60)-1using namespace std;int n;int a[100100];int len[100100];int s[100100];int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); mst(len,0); mst(s,0); for(int i=1;i<=n;i++) scanf("%d",&a[i]); len[1]=1; s[1]=a[1]; int cnt=1; for(int i=2;i<=n;i++){ if(a[i]>s[cnt]){ s[++cnt]=a[i]; len[i]=cnt; continue; } else { int x=lower_bound(s+1,s+cnt+1,a[i])-s; if(x>cnt) len[i]=cnt; else len[i]=x; s[x]=a[i]; } } for(int i=1;i<=n;i++) { if(i==n) cout<<len[i]<<endl; else cout<<len[i]<<" "; } } return 0;}/*1053 2 1 1 41071 1 2 2 1 1 2*/
0 0
- BestCoder Round #84 1002 hdu 5748 最长上升子序列
- hdu 5748 Bellovin(BestCoder Round #84——最长递增子序列)
- hdoj5748 Bellovin 【BestCoder Round #84】 (最长上升序列)
- 【HDU5748 BestCoder Round 84B】【LIS模板 最长单调上升子序列】Bellovin 以尾端点最长LIS压缩数组
- hdu 5748 最长上升子序列
- 最长上升子序列1002
- HDU 5748 Bellovin(最长上升子序列[nlogn])
- HDU 1025 最长上升子序列
- HDU 1423 最长上升公共子序列
- hdu 1423 最长公共上升子序列
- HDU 1257 最长上升子序列
- HDU 1087(最长上升子序列)
- HDU 1160(类似于最长上升子序列)
- hdu 4512 最长公共上升子序列
- HDU 1087 最长上升子序列
- 最长上升子序列(LIS)(HDU 1025)
- hdu 1257 最长上升子序列问题
- hdu 1069 (最长上升子序列)
- js的call和apply函数的使用
- 3.3 从标准输入读入一个数,把它转为英语单词输出,如读入 234,输出“two three four”。
- event面向对象【笔记-未完】
- Openstack Gnocchi 笔记
- 3.4 编写一个程序,将用户输入的数字(0~6)转换成相应的星期值输出。如用户输 入 3,则程序输出“Today is Wed”;用户输入 0,则输出“Today is Sun”。如果用户输入 的数据
- BestCoder Round #84 1002 hdu 5748 最长上升子序列
- 54.Automatic Shared Memory Management (ASMM) has been enabled for your database instance. The initia
- zookeeper入门(二)——zk客户端脚本使用
- 3.5 编写一个程序,从标准输入读入某职员的工作时间(以小时计)和每小时的工资 数,计算并输出他的工资。若职员月工作时间超过 40 小时,则超过部分按原工资的 1.5 倍 来计算。
- 快速旋转数组(或字符串)
- 3.7 编写一个程序,以字符形式输入某进制的数字,将其转换为十进制数值并显示出
- libpng warning: iCCP: Not recognizing known sRGB profile that has been edited
- [2016ACM多校] HDU5730 FFT 重叠相加法
- BestCoder Round #84 1004 hdu 5750 数论