zoukankan      html  css  js  c++  java
  • 单调栈 BZOJ1345 [Baltic2007]序列问题Sequence

    1345: [Baltic2007]序列问题Sequence

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 899  Solved: 471
    [Submit][Status][Discuss]

    Description

    对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列。这一操作的代价是max(ai,ai+1)。进行n-1次该操作后,可以得到一个长度为1的序列。我们的任务是计算代价最小的reduce操作步骤,将给定的序列变成长度为1的序列。

    Input

    第一行为一个整数n( 1 <= n <= 1,000,000 ),表示给定序列的长度。接下来的n行,每行一个整数ai(0 <=ai<= 1, 000, 000, 000),为序列中的元素。

    Output

    只有一行,为一个整数,即将序列变成一个元素的最小代价。

    Sample Input

    3
    1
    2
    3

    Sample Output

    5

    HINT

    30%的测试数据 n<=500;
    50%的测试数据 n <= 20,000。

    依然单调栈水~

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int n,top,stack[1000010];
     7 long long ans;
     8 int main(){
     9     scanf("%d",&n);
    10     stack[0]=0x3f3f3f3f;
    11     int x;
    12     while(n--){
    13         scanf("%d",&x);
    14         while(top&&x>=stack[top]){
    15             if(x>=stack[top-1])    ans+=stack[top-1],top--;
    16             else ans+=x,top--;
    17         }
    18         stack[++top]=x;
    19     }
    20     while(top>1) ans+=stack[--top];
    21     printf("%lld",ans);
    22     return 0;    
    23 }
  • 相关阅读:
    c语言分支和循环语句
    C语言基础知识
    磁盘管理-fdisk
    搭建Discuz
    KVM创建虚拟机相关操作
    WINRAR exe 捆绑 小游戏
    linux vi编辑器&文件目录管理
    灰鸽子木马的功能体验
    sqlalchemy 级联删除
    sqlalchemy 多对多
  • 原文地址:https://www.cnblogs.com/zwube/p/7189568.html
Copyright © 2011-2022 走看看