干物妹小埋(吉首大学2019)---线段树+dp

巧了我就是萌 提交于 2019-11-26 10:12:48

链接: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核心: 题意很可爱,但我只会线段树吧,开心,1C...今天qixi, 想你!!
#include <bits/stdc++.h>  #define lson l, m, rt*2  #define rson m+1, r, rt*2+1  using namespace std;  typedef long long LL;  const int N=2e5+7;  LL tree[4*N];  int a[N], sort_a[N];  int val[N];  int n, cnt;  inline void pushup(int rt) {      tree[rt]=max(tree[rt*2], tree[rt*2+1]);  }  LL query(int L, int R, int l, int r, int rt) {      if (r<L||l>R) return 0;      if (l>=L&&r<=R) return tree[rt];      int m=(l+r)/2;      return max (query(L, R, lson), query(L, R, rson));  }  void update(int k, LL key, int l, int r, int rt) {      if (l==r)  {          tree[rt]=max(tree[rt], key);          return ;      }      int m=(l+r)/2;      if (k<=m)          update(k, key, lson);      else           update(k, key, rson);      pushup(rt);  }  int main()  {      scanf("%d", &n);      for (int i=1;i<=n;i++) {          scanf("%d", &a[i]);          sort_a[i]=a[i];      }      for (int i=1;i<=n;i++)          scanf("%d", &val[i]);      sort(sort_a+1, sort_a+1+n);      cnt=1;       for (int i=2;i<=n;i++)          if (sort_a[i]!=sort_a[cnt])              sort_a[++cnt]=sort_a[i];      LL ans=0;      for (int i=n;i>=1;i--) {          int k=lower_bound(sort_a+1, sort_a+1+cnt, a[i])-sort_a;          //printf("%d\n",k);          LL tmp=query(k, cnt, 1, cnt, 1)+val[i];          ans=max(ans, tmp);          update(k, tmp, 1, cnt, 1);      }      printf("%lld\n",ans);      return 0;  }

 

 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!