吉首大学2019年程序设计竞赛(重现赛)B——干物妹小埋(树状数组+二分)

链接:https://ac.nowcoder.com/acm/contest/992/B
来源:牛客网
 

题目描述

在之前很火的一个动漫《干物妹小埋》中,大家对小埋打游戏喝可乐的印象十分的深刻。

现在欧尼酱将小埋的快乐水全部分开藏在了家具的顶端。

小埋使出空中1080°转身接战术翻滚跳到任一家具上,她相信,只要她翻滚的足够快,欧尼酱就跟不上她。

 

1.为获取梦幻开局,小埋一套技能可以使她一开始掉落在任一家具上。

2.小埋家的家具按顺序给出,每个家具可跳可不跳,为避开欧尼酱的追击,小埋翻滚到某个家具上面后,只能向前继续翻滚。

3.启动超重力感应系统的小埋不会从较高的家具翻滚到较低的家具上。

4.由于每个家具上的快乐水都有对应的happy值,IQ==250的小埋会选择一条happy值总和最大的路线。

那么,最终小埋将获得的happy值总和是多少呢?

输入描述:

第一行一个整数n(0<n<=200000),表示小埋家的家具数。

第二行n个整数,对于每个整数ai, 0<=ai<=10^9,表示第i个家具的高度。

第三行n个整数,对于每个整数vi, 0<=vi<=10^9,表示第i个家具上的快乐水的happy值。

输出描述:

一个整数,表示小埋获得的happy值总和。

示例1

输入

复制

6
2 1 1 3 3 4
3 1 1 1 1 1

输出

复制

6

说明

路线:2->3->3->4

答案:3+1+1+1

题意:给一个n,一共有n个位置,每个位置有一个高度和价值,小埋可以从任一位置开始走,每个位置他可以选择走还是不走,只能往前走,只能从高度低的位置到高度高的位置,求走过路径上的最大价值和~

题解:叫人很晕的树状数组~~

unique的用法:比如给出11234556 ,unique完成之后变成12345656,返回的是(123456!56)感叹号的位置!

上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 2e5+100;
int n;
ll c[MAX],a[MAX],b[MAX],ans;
vector<ll>v;
int lb(int x){return x&(-x);}
void update(int x,ll k){
    while(x<n){
        c[x]=max(c[x],k);
        x+=lb(x);
    }
}
ll get_max(int x){
    ll res=0;
    while(x){
        res=max(res,c[x]);
        x-=lb(x);
    }
	return res;
}
int main(){
    cin >> n;
    for (int i = 1; i <= n;i++){
        cin >> a[i];
        v.push_back(a[i]);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for (int i = 1; i <= n;i++){
        cin >> b[i];
        int x=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
        ll tmp=get_max(x);
        ans=max(ans,b[i]+tmp);
        update(x,b[i]+tmp);
    }
    cout << ans << endl;
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值