构造算法题目积累

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':' '));
}
全部评论

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务