计蒜客 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L题

Let SS be a sequence of integers s_{1}s1s_{2}s2......s_{n}sn Each integer is is associated with a weight by the following rules:

(1) If is is negative, then its weight is 00.

(2) If is is greater than or equal to 1000010000, then its weight is 55. Furthermore, the real integer value of s_{i}si is s_{i}-10000si10000 . For example, if s_{i}si is 1010110101, then is is reset to 101101 and its weight is 55.

(3) Otherwise, its weight is 11.

A non-decreasing subsequence of SS is a subsequence s_{i1}si1s_{i2}si2......s_{ik}sik, with i_{1}i1<i2 ... <ik, such that, for all 1 \leq j1j<k, we have s_{ij}sij<sij+1.

A heaviest non-decreasing subsequence of SS is a non-decreasing subsequence with the maximum sum of weights.

Write a program that reads a sequence of integers, and outputs the weight of its

heaviest non-decreasing subsequence. For example, given the following sequence:

8080 7575 7373 9393 7373 7373 1010110101 9797 -11 -11 114114 -11 1011310113 118118

The heaviest non-decreasing subsequence of the sequence is <73, 73, 73, 101, 113, 118><73,73,73,101,113,118> with the total weight being 1+1+1+5+5+1 = 141+1+1+5+5+1=14. Therefore, your program should output 1414 in this example.

We guarantee that the length of the sequence does not exceed 2*10^{5}2105

Input Format

A list of integers separated by blanks:s_{1}s1s_{2}s2,......,s_{n}sn

Output Format

A positive integer that is the weight of the heaviest non-decreasing subsequence.

样例输入

80 75 73 93 73 73 10101 97 -1 -1 114 -1 10113 118

样例输出

14

题目来源

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛


题意:就是给你一串数字,以输入结束符结束输入,然后在这些数字中,小于零的数字权值为 0,大于等于10000的数字的权值为 5,而且这些数字要减去10000,其余数字的权值为 1 。


题解:这题有点坑,比赛时我就没做到,其实大于10000的数字的权值为 5,可不可以就等于5个权值为1的数字呢。然后这道题就变成时间为nlog(n)的最长上升子序列了。



AC代码:

#include
#include
#include
#include
#include
#include
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
///o(っ。Д。)っ AC万岁!!!!!!!!!!!!!!
const int maxn = 15520200;
int maps[maxn] = {}, dp[maxn] = {};
int bin_searchs(int l, int r, int k)
{
    if(l >= r)
    {
        return l;
    }
    int mid = (l + r + 1) / 2;
    if(dp[mid] > k)
    {
        return bin_searchs(l, mid - 1, k);
    }
    else return bin_searchs(mid, r, k);
}
int main()
{
    int cnt = 0, book;
    while(scanf("%d", &book) != EOF)
    {
        if(book >= 10000)
        {
            book -= 10000;
            for(int i = 1; i <= 5; i++)
            {
                maps[++cnt] = book;
            }
        }
        else if(book < 0)
        {
            continue;
        }
        else maps[++cnt] = book;
    }
    int counter = 1;
    dp[1] = maps[1];
    for(int i = 2; i <= cnt; i++)
    {
        if(maps[i] >= dp[counter])
        {
            dp[++counter] = maps[i];
        }
        else
        {
            int kk = bin_searchs(1, counter, maps[i]);
            if(dp[kk] <= maps[i])
            {
                kk++;
            }
            dp[kk] = maps[i];
            if(kk > counter) counter++;
        }


    }
    printf("%d\n", counter);
    return 0;
}
/*


*/




你可能感兴趣的:(最大上升子序列)