您的位置:首页 > 其它

BZOJ1046: [HAOI2007]上升序列(洛谷P2215)

2018-03-01 09:20 387 查看

DP

BZOJ题目传送门

洛谷题目传送门

首先预处理以ii为起点的LIS。

一看O(nm)O(nm)不会超,那么每次询问复杂度应该就是O(n)O(n)的了。

扫一遍过去,记下f[i]≥l−kf[i]≥l−k且a[i]>a[k]a[i]>a[k]的a[i]a[i],最后输出即可。

注意过滤行末空格。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
#define M 1005
using namespace std;
int n,m,sum,f
,a
,ans
;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=1;
for (int i=n;i;i--)
for (int j=n;j>i;j--)
if (a[j]>a[i]) f[i]=max(f[i],f[j]+1);//常数小(其实是我懒)所以就用O(n²)了
scanf("%d",&m); int l,x;
while (m--){
scanf("%d",&l),sum=0;
for (int i=0;i<=n&&l;i=x,l--){
for (x=i+1;x<=n;x++)
if (f[x]>=l&&a[x]>a[i]) break;
if (x>n) break; ans[++sum]=a[x];
}
if (l) puts("Impossible");
else{
for (int i=1;i<sum;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[sum]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: