zoukankan      html  css  js  c++  java
  • CodeForces 940E

    题意略。

    这个题目我开始题意理解得有点问题。本题的实质是在这个数列中选择一些数字,使得选出的这些数字之和最大,用dp来解。

    我们先要明确:当我选择数列长度为2 * c时,不如把这个长度为2 * c的劈成两个c,这样对答案的贡献更大一些。

    定义dp[i]为我在[i,n]中可谋取的最大贡献。

    dp[i] = max{dp[k]} + earn[i,i + c - 1] (i + c <= k <= n - c - 1)。

    可用单调队列优化。

    详见代码:

    #include<bits/stdc++.h>
    #define maxn 100005
    using namespace std;
    typedef long long LL;
    
    LL ai[maxn],dp[maxn];
    LL st[maxn][17],mm[maxn];
    int que[maxn],head,tail,n,c;
    
    void init(){
        mm[0] = -1;
        for(int i = 1;i < maxn;++i){
            mm[i] = (i & (i - 1)) == 0 ? mm[i - 1] + 1 : mm[i - 1];
        }
    }
    void init_rmq(){
        for(int i = 1;i <= n;++i) st[i][0] = ai[i];
        for(int j = 1;j <= mm[n];++j){
            for(int i = 1;i + (1<<j) - 1 <= n;++i){
                st[i][j] = min(st[i][j - 1],st[i + (1<<(j - 1))][j - 1]);
            }
        }
    }
    LL rmq(int l,int r){
        LL k = mm[r - l + 1];
        return min(st[l][k],st[r - (1<<k) + 1][k]);
    }
    
    int main(){
        init();
        while(scanf("%d%d",&n,&c) == 2){
            LL sum = 0;
            for(int i = 1;i <= n;++i){
                scanf("%lld",&ai[i]);
                sum += ai[i];
            }
            init_rmq();
            memset(dp,0,sizeof(dp));
            head = tail = 0;
            LL ans = 0;
            for(int i = n - c + 1;i >= 1;--i){
                dp[i] = dp[que[head]] + rmq(i,i + c - 1);
                ans = max(ans,dp[i]);
                while(head < tail && dp[que[tail - 1]] < dp[i + c - 1]) --tail;
                que[tail++] = i + c - 1;
            }
            printf("%lld
    ",sum - ans);
        }
        return 0;
    }
  • 相关阅读:
    详解用em替换px
    js判断是否为ie浏览器
    nth-child()选择器小结
    HTML5之canvas
    MQTT-SN协议乱翻之消息格式
    MQTT-SN协议乱翻之简要介绍
    MQTT 3.1.1,值得升级的6个新特性
    MQTT 3.1协议非严肃反思录
    MQTT协议笔记之mqtt.io项目HTTP协议支持
    MQTT协议笔记之mqtt.io项目Websocket协议支持
  • 原文地址:https://www.cnblogs.com/tiberius/p/8537540.html
Copyright © 2011-2022 走看看