干物妹小埋
链接:https://ac.nowcoder.com/acm/contest/992/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
在之前很火的一个动漫《干物妹小埋》中,大家对小埋打游戏喝可乐的印象十分的深刻。
现在欧尼酱将小埋的快乐水全部分开藏在了家具的顶端。
小埋使出空中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
说明
路线:2->3->3->4
答案:3+1+1+1
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+7; int n; ll c[maxn]; ll a[maxn],val[maxn],t[maxn]; ll lowbit(int x){ return x&(-x); } ll query(int pos){ ll cur=0; while(pos>=1){ cur=max(cur,c[pos]); pos-=lowbit(pos); } return cur; } void update(int pos,ll val){ while(pos<=n){ c[pos]=max(c[pos],val); pos+=lowbit(pos); } } int main(){ //freopen("1.txt","r",stdin); scanf("%d",&n); for(register int i=1;i<=n;++i){ scanf("%lld",a+i); t[i]=a[i]; } for(register int i=1;i<=n;++i){ scanf("%lld",val+i); } sort(t+1,t+1+n); int cnt=unique(t+1,t+1+n)-t-1; for(int i=1;i<=n;++i){ a[i]=lower_bound(t+1,t+1+cnt,a[i])-t; } for(register int i=1;i<=n;++i){ val[i]+=query(a[i]); update(a[i],val[i]); } ll ans=0; for(register int i=1;i<=n;++i){ ans=max(ans,val[i]); } printf("%lld\n",ans); return 0; }