1046: [HAOI2007]上升序列
题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=1046
先求最长上升子序列中的d数组(d[i]表示以第i个数开头的最长的LIS的长度)。
每一个询问,如果比最长上升子序列长度大就无解,否则有解。
对于一个询问m,答案序列的第i位s[i]为:从答案序列的上一位+1开始的第一个j使得a[j]>s[i-1]并且d[j]>=m-i的a[j]。
输出的时候注意不要有行末空格不然会PE……
#include
<
iostream
>
#include
<
cstring
>
#include
<
cstdlib
>
#include
<
cstdio
>
using
namespace
std;
const
int
MaxN
=
10001
;
int
n,m,a[MaxN],d[MaxN];
int
s[MaxN];
void
init()
{
cin
>>
n;
for
(
int
i
=
0
;i
<
n;i
++
)
{
cin
>>
a[i];
}
cin
>>
m;
}
void
treat()
{
for
(
int
i
=
n
-
1
;i
>=
0
;i
--
)
{
for
(
int
j
=
i
+
1
;j
<
n;j
++
)
{
if
(a[i]
<
a[j]) d[i]
=
max(d[i],d[j]);
}
d[i]
++
;
//
cout<<d[i]<<' ';
}
//
cout<<endl;
}
void
work(
int
k)
{
int
j
=
0
;
for
(
int
i
=
k;i
>
0
;i
--
)
{
for
(;j
<
n
&&
(d[j]
<
i
||
(k
!=
i
&&
a[j]
<=
s[k
-
i
-
1
]));j
++
);
if
(j
==
n)
{
printf(
"
Impossible\n
"
);
return
;
}
s[k
-
i]
=
a[j];
j
++
;
}
for
(
int
i
=
0
;i
<
k
-
1
;i
++
)
{
printf(
"
%d
"
,s[i]);
}
printf(
"
%d\n
"
,s[k
-
1
]);
}
int
main()
{
init();
treat();
for
(
int
i
=
0
;i
<
m;i
++
)
{
int
k;
cin
>>
k;
work(k);
}
return
0
;
}
posted on 2013-02-14 18:11
Kiro
阅读(154)
评论(0)
编辑
收藏
引用
所属分类:
衡八oj
只有注册用户
登录
后才能发表评论。
相关文章:
1055: [HAOI2008]玩具取名
1054: [HAOI2008]移动玩具
1051: [HAOI2006]受欢迎的牛
1050: [HAOI2006]旅行comf
1046: [HAOI2007]上升序列
1042: [HAOI2008]硬币购物
1037: [ZJOI2008]生日聚会Party
1034: [ZJOI2008]泡泡堂BNB
1029: [JSOI2007]建筑抢修
1027: [JSOI2007]合金
网站导航:
博客园
博客园最新博文
博问
管理
4myOI
再给我一次机会将故事改写。
导航
C++博客
首页
新随笔
联系
聚合
管理
统计
随笔 - 0
文章 - 27
评论 - 0
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章分类
■
hdu(1)
(rss)
■
poj(2)
(rss)
■
衡八oj(24)
(rss)
■
其他
(rss)
文章档案
■
2013年2月 (17)
■
2013年1月 (3)
■
2012年10月 (3)
■
2012年9月 (1)
■
2012年3月 (1)
■
2012年2月 (2)
搜索
最新评论