zoukankan      html  css  js  c++  java
  • 干物妹小埋(吉首大学2019)---线段树+dp

    链接: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
    ",k);
            LL tmp=query(k, cnt, 1, cnt, 1)+val[i];
            ans=max(ans, tmp);
            update(k, tmp, 1, cnt, 1);
        }
        printf("%lld
    ",ans);
        return 0;
    }
     
  • 相关阅读:
    sql 查出一张表中重复的所有记录数据
    几种常见SQL分页方式效率比较
    Redis命令参考之复制(Replication)
    Redis-benchmark使用总结
    redis压力测试详解
    c#:ThreadPool实现并行分析,并实现线程同步结束
    C#多线程学习 之 线程池[ThreadPool]
    [C#基础]ref和out的区别
    C#:ref和out的联系及区别。
    生产环境中使用Docker Swarm的一些建议
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/11317528.html
Copyright © 2011-2022 走看看