C102 单调栈 P1901 发射站

视频链接:C102 单调栈 P1901 发射站_哔哩哔哩_bilibili

 

 

Luogu P1901 发射站

// 单调栈 O(n)
#include<iostream>
using namespace std;

const int N=1000005;
int n,h[N],v[N];
int sum[N]; //sum[i]:每个站接收的能量和
int q[N];   //

int main(){
  cin>>n;
  for(int i=1;i<=n;i++) cin>>h[i]>>v[i];
  
  int top=0;
  for(int i=1;i<=n;i++){
    while(top && h[q[top]]<h[i])
      sum[i]+=v[q[top--]]; //栈顶的能量给i
    sum[q[top]]+=v[i];     //i的能量给栈顶
    q[++top]=i;            //i入栈
  }
  
  int ans=0;
  for(int i=1;i<=n;i++)ans=max(ans,sum[i]);
  cout<<ans;
}

 

Luogu P1823 [COI2007] Patrik 音乐会的等待

// 单调栈 O(n)
#include<iostream>
using namespace std;

const int N=1000005;
int n,h[N];
int sum[N]; //sum[i]:i前面未挡的与i等高的人数
int q[N];   //

int main(){
  cin>>n;
  for(int i=1;i<=n;i++) cin>>h[i],sum[i]=1;
   
  int top=0; long long ans=0;
  for(int i=1;i<=n;i++){
    while(top && h[q[top]]<=h[i]){ //i比栈顶高
      ans+=sum[q[top]]; //i能看见栈顶的
      // 后面能看见i的,一定能看见前面未挡的等高的
      if(h[q[top]]==h[i]) sum[i]+=sum[q[top]];
      top--;
    }
    if(top) ans++; //i比栈顶矮,栈顶能看见i
    q[++top]=i;
  }

  cout<<ans;
}

 

posted @ 2024-03-16 11:11  董晓  阅读(135)  评论(0编辑  收藏  举报