码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5748 BestCoder Round #84 Bellovin (LIS)

时间:2016-07-24 19:35:39      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

Bellovin

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 540    Accepted Submission(s): 254

Problem Description
Peter has a sequence a技术分享1技术分享,a技术分享2技术分享,...,a技术分享n技术分享技术分享 and he define a function on the sequence -- F(a技术分享1技术分享,a技术分享2技术分享,...,a技术分享n技术分享)=(f技术分享1技术分享,f技术分享2技术分享,...,f技术分享n技术分享)技术分享, where f技术分享i技术分享技术分享 is the length of the longest increasing subsequence ending with a技术分享i技术分享技术分享.

Peter would like to find another sequence b技术分享1技术分享,b技术分享2技术分享,...,b技术分享n技术分享技术分享 in such a manner that F(a技术分享1技术分享,a技术分享2技术分享,...,a技术分享n技术分享)技术分享 equals to F(b技术分享1技术分享,b技术分享2技术分享,...,b技术分享n技术分享)技术分享. Among all the possible sequences consisting of only positive integers, Peter wants the lexicographically smallest one.

The sequence a技术分享1技术分享,a技术分享2技术分享,...,a技术分享n技术分享技术分享 is lexicographically smaller than sequence b技术分享1技术分享,b技术分享2技术分享,...,b技术分享n技术分享技术分享, if there is such number i技术分享 from 1技术分享 to n技术分享, that a技术分享k技术分享=b技术分享k技术分享技术分享 for 1k<i技术分享 and a技术分享i技术分享<b技术分享i技术分享技术分享.

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技术分享 (1n100000)技术分享 -- the length of the sequence. The second line contains n技术分享 integers a技术分享1技术分享,a技术分享2技术分享,...,a技术分享n技术分享技术分享 (1a技术分享i技术分享10技术分享9技术分享)技术分享.

Output
For each test case, output n技术分享 integers b技术分享1技术分享,b技术分享2技术分享,...,b技术分享n技术分享技术分享 (1b技术分享i技术分享10技术分享9技术分享)技术分享 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
Source
Recommend
wange2014

题解:求以ai结尾的最长上升子序列(LIS)为多少。
     就是求LIS。
AC代码:
//#include<bits/stdc++.h>
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define N 1000010
using namespace std;
int n,a[N];
int b[N];
int cnt;
int s[N];
int f[N];
int query(int x)
{
	int ret =0;
	while(x){
		ret= max(ret,s[x]);
		x-= x&-x;
	}
	return ret;
}
void update(int x,int y)
{
	while(x<=cnt)
	{
		s[x]=max(s[x],y);
		x+=x&-x;
	}
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
    	cnt=0;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    		b[++cnt]=a[i];
		}
		sort(b+1,b+cnt+1);
		cnt=unique(b+1,b+cnt+1)-b-1;
		for(int i=1;i<=n;i++)
		{
			a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
		}
		for(int i=1;i<=cnt;i++) s[i]=0;
		for(int i=1;i<=n;i++)
		{
			f[i]=query(a[i]-1)+1;
			update(a[i],f[i]);
			printf("%d%c",f[i],i==n?'\n':' ');
		}
	}
    return 0;
}


HDU 5748 BestCoder Round #84 Bellovin (LIS)

标签:

原文地址:http://blog.csdn.net/liangzhaoyang1/article/details/52015444

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!