2017 ICPC 南宁 L 带权最大递增子序列

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
const int maxm = 800005;
int h[maxm], num[maxn];
int n, m;
int lowbit(int x)
{
        return x & (-x);
}
void update(int x)
{
        while (x <= n)
        {
                h[x] = num[x];
                for (int i = 1; i < lowbit(x); i <<= 1)
                {
                        h[x] = max(h[x], h[x - i]);
                }
                x += lowbit(x);
        }
        return ;
}
int findans(int begin, int end)
{
        int ans = 0;
        while (end >= begin)
        {
                ans = max(ans, num[end]);
                end--;
                for (; end - lowbit(end) >= begin; end -= lowbit(end))
                {
                        ans = max(ans, h[end]);
                }
        }
        return ans;
}
int main()
{
        n=200005;
        int ans = -1;
        int teshu = 0;
        int now;
        memset(h, 0, sizeof(h));
        while (scanf("%d", &now) != EOF)
        {
                if (now < 0)
                {
                        continue;
                }
                if (now >= 10000)
                {
                        now %= 10000;
                        if (now == 0)
                        {
                                teshu += 5;
                        }
                        else
                        {
                                int cur = max(findans(1, now), teshu) + 5;
                                ans = max(ans, cur);
                                num[now] = cur;
                                update(now);
                        }
                }
                else
                {
                        if (now == 0)
                        {
                                teshu += 5;
                        }
                        else
                        {
                                int cur = max(findans(1, now), teshu) + 1;
                                ans = max(ans, cur);
                                num[now] = cur;
                                update(now);
                        }
                }
        }
        cout<<ans<<endl;
        return 0;
}

 

posted @ 2017-09-24 23:37  Aragaki  阅读(279)  评论(0编辑  收藏  举报