欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PIPIOJ 1348: PIPI的序列问题Ⅱ 接雨水 单调栈

程序员文章站 2022-04-01 17:27:06
...

题目:

http://39.106.164.46/problem.php?id=1348

思路:

可以先学习一下单调栈
单调栈

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<set>
#define MAX 100005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int n;
int a[MAX];

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    stack<int> s;
    ll ans=0;
    for(int i=0;i<n;i++){
        if(s.empty()||a[s.top()]>=a[i]){
			s.push(i);
		}else{
			while(!s.empty()&&a[s.top()]<a[i]){
				int id=s.top();
                s.pop();
				if(s.empty()) break;
				ll d=i-s.top()-1; //d是宽度
				ll h=min(a[i],a[s.top()])-a[id]; //h是高
				ans+=d*h;
			}
			s.push(i);
		}
    }
    cout<<ans<<endl;
    return 0;
}
相关标签: PIPIOJ