链接: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;
}