cf1304D
题目给出n-1个‘<’‘>’约束,第i个位置的<意味着结果串中a[i]<a[i+1],要求用1~n个数构造出两个串,分别拥有最小和最大的LIS。
思路:我们将升序1~n中连续>的区间执行reverse操作,执行完毕后的结果就是拥有最大LIS的满足约束的结果串。
证明:这种方法利用了全部的上升区间,及下降区间的一侧边界。我们知道对于连续下降区间,最多只能有一个元素被选入LIS,因此整体利用率达到最大。
最短的类似,首先降序n~1,然后不满足约束的reverse。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| for(int i=0;i<n;i++)
ans[i]=i+1;
l=0,r=0;
for(int i=0;i<n-1;i++){
if(cst[i]=='>'){
r=i+1;
}else{
if(l<r)
reverse(ans+l,ans+r+1);
l=i+1;
}
}
if(l<r)
reverse(ans+l,ans+r+1);
for(int i=0;i<n;i++){
printf("%d%c",ans[i],(i==n-1?'\n':' '));
}
|