次长上升子序列

题目描述
最长上升子序列是一道经典的题目,liu_runda很想在模拟赛中考考这个题目,但是他又不想被选手骂出原题,于是就把原题魔改一下再出出来.
对于一个数列a[1],a[2]…a[n], 我们定义子序列是一系列下标的集合: {x1,x2…xm}
其中, 1<=x1<x2<x3…<xm<=n
本题的上升子序列应满足a[x1]<=a[x2]<=a[x3]…<=a[xm], 也就是说, 我们考虑的是非严格的上升子序列(或者说,不下降子序列)
两个子序列不同, 当且仅当有一个下标被一个子序列包含却不被另一个子序列包含.
给出一个数列, 你需要找出所有非严格的上升子序列中第二长的子序列的长度. 它有可能比最长上升子序列短, 也有可能和最长上升子序列一样长.

输入
每个输入包含多组测试数据,第一行一个整数T表示测试数据的组数.
接下来每组数据第一行一个整数n, 表示数列的长度,第二行n个整数表示数列.

输出
T行, 第i行一个数字表示第i组输入的次长上升子序列长度
样例输入 Copy
5
10
10 1 8 10 2 6 4 1 5 4
10
8 2 6 1 6 8 10 3 7 4
10
1 8 7 9 9 6 10 3 2 2
10
5 4 8 2 2 2 2 9 3 3
10
8 4 9 7 6 9 10 3 7 3
样例输出 Copy
4
4
5
5
4
提示
100%的数据, T=5, 1<=ai<=100000,n≤100000问题 A: 次长上升子序列
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
最长上升子序列是一道经典的题目,liu_runda很想在模拟赛中考考这个题目,但是他又不想被选手骂出原题,于是就把原题魔改一下再出出来.
对于一个数列a[1],a[2]…a[n], 我们定义子序列是一系列下标的集合: {x1,x2…xm}
其中, 1<=x1<x2<x3…<xm<=n
本题的上升子序列应满足a[x1]<=a[x2]<=a[x3]…<=a[xm], 也就是说, 我们考虑的是非严格的上升子序列(或者说,不下降子序列)
两个子序列不同, 当且仅当有一个下标被一个子序列包含却不被另一个子序列包含.
给出一个数列, 你需要找出所有非严格的上升子序列中第二长的子序列的长度. 它有可能比最长上升子序列短, 也有可能和最长上升子序列一样长.

输入
每个输入包含多组测试数据,第一行一个整数T表示测试数据的组数.
接下来每组数据第一行一个整数n, 表示数列的长度,第二行n个整数表示数列.

输出
T行, 第i行一个数字表示第i组输入的次长上升子序列长度
样例输入 Copy
5
10
10 1 8 10 2 6 4 1 5 4
10
8 2 6 1 6 8 10 3 7 4
10
1 8 7 9 9 6 10 3 2 2
10
5 4 8 2 2 2 2 9 3 3
10
8 4 9 7 6 9 10 3 7 3
样例输出 Copy
4
4
5
5
4
提示
100%的数据, T=5, 1<=ai<=100000,n≤100000问题 A: 次长上升子序列
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
最长上升子序列是一道经典的题目,liu_runda很想在模拟赛中考考这个题目,但是他又不想被选手骂出原题,于是就把原题魔改一下再出出来.
对于一个数列a[1],a[2]…a[n], 我们定义子序列是一系列下标的集合: {x1,x2…xm}
其中, 1<=x1<x2<x3…<xm<=n
本题的上升子序列应满足a[x1]<=a[x2]<=a[x3]…<=a[xm], 也就是说, 我们考虑的是非严格的上升子序列(或者说,不下降子序列)
两个子序列不同, 当且仅当有一个下标被一个子序列包含却不被另一个子序列包含.
给出一个数列, 你需要找出所有非严格的上升子序列中第二长的子序列的长度. 它有可能比最长上升子序列短, 也有可能和最长上升子序列一样长.

输入
每个输入包含多组测试数据,第一行一个整数T表示测试数据的组数.
接下来每组数据第一行一个整数n, 表示数列的长度,第二行n个整数表示数列.

输出
T行, 第i行一个数字表示第i组输入的次长上升子序列长度
样例输入
5
10
10 1 8 10 2 6 4 1 5 4
10
8 2 6 1 6 8 10 3 7 4
10
1 8 7 9 9 6 10 3 2 2
10
5 4 8 2 2 2 2 9 3 3
10
8 4 9 7 6 9 10 3 7 3
样例输出
4
4
5
5
4
提示
100%的数据, T=5, 1<=ai<=100000,n≤100000

因为要找第二长的子序列, 所以先贪心dp一下最长的非严格上升子序列, 然后我们再求一下得出这个序列的方案数, 如果得出最长的子序列方案数大于1,那么答案就是最长的方案书序列长度, 不然的会就是最长长度减1

#pragma GCC optimize(3 , "Ofast" , "inline")
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e5 + 10 ;
int dp[N] , a[N] , p[N] , now[N] ;
int main()
{
    int n ;
    int T ;
    cin >> T ;
    while(T --)
    {
        scanf("%d" , &n) ;
        for(int i = 1; i <= n ;i ++)  scanf("%d" , &a[i]) ;
        memset(dp , 0 , sizeof dp) , memset(now , 0 , sizeof now) ;
        memset(p , 0 , sizeof p) ;
        int cnt = 0 ;
        dp[++ cnt] = a[1] , p[1] = 1 ;
        for(int i = 2 ; i <= n ;i ++)
         {
             if(a[i] >= dp[cnt]) dp[++ cnt] = a[i] , p[i] = cnt ;
             else
              {
                    int pos = upper_bound(dp + 1 , dp + cnt + 1 , a[i]) - dp ;
                    if(a[i] >= dp[pos - 1]) p[i] = pos ;
                    else p[i] = 1 ;
                    dp[pos] = a[i] ;
                }
         }
         vector<int> v[N] ;
         int ans = 0 ;
         for(int i = 1; i <= n ;i ++)
          {
                if(p[i] == 1) now[i] ++ ;
                for(auto x : v[p[i] - 1])
                     if(a[i] >= a[x]) now[i] += now[x] ;
                if(p[i] == cnt) ans += now[i] ;
                if(ans > 1) break ;
                v[p[i]].push_back(i) ;
            }
            printf("%d\n" , cnt - (ans <= 1)) ;
    }

}
全部评论

相关推荐

07-02 13:52
武汉大学 golang
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务