积木积水

来源:互联网 发布:sql in exists 效率 编辑:程序博客网 时间:2024/05/17 05:05


http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=4

找到最长的那个柱子,在水满的情况下,从前往后,在它左边水面是非递减的,右边是非递增的(如果从最后一个柱子往中看也是非递减的)

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define mst(a,k)  memset(a,k,sizeof(a));#define LL long long#define maxn 1000005#define mod 100000007int a[maxn];int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int n,t;    scan(t);    while(t--)    {        scan(n);        int maxc=-1,idx;        REP(i,0,n)        {            scan(a[i]);            if(a[i]>maxc)            {                maxc=a[i];                idx=i;            }        }        LL sum=0;        int last=a[0];//last表示当前最长的柱子        REP(i,1,idx)        {            if(a[i]<=last)//如果比它短就加上                sum+=(last-a[i]);            else    //否则更新last                last=a[i];        }        last=a[n-1];        for(int i=n-1;i>idx;i--)        {             if(a[i]<=last)                sum+=(last-a[i]);            else                last=a[i];        }        printf("%lld\n",sum);    }    return 0;}


0 0