Codeforces 319B. Psychos in a Line【单调栈】

题目链接:

http://codeforces.com/problemset/problem/319/B

题意:

一串数列,每一个值如果大于相邻右一位的值的话,那么就可以把右边这个值“吃掉”(右一位消失,原来的值不变),问需要吃多少次才能到达无法再吃的状态。

思路:

利用栈。遍历一遍数组,处理每个值的时候,如果栈顶的元素小于该值,那么将其弹出,知道栈顶元素大于该值或者栈为空,栈内的每个元素记录下一个属性:他是在第几次被“吃掉”,进栈的新元素的被吃次数就是它弹出去的元素中的属性的最大值+1,如果没有弹任何值则为1;如果栈空,则值为0;

保持整个队列递减

策略如下

如果一个数进去没有弹出数,则这个数肯定是第一场就被消掉的

如果一个数进去弹出了一些数,则该数被吃掉的场次等于它弹走的所有数中最大的被吃掉的场次序号+1,因为,这个数肯定是在它弹掉的数之后被吃掉的(它被弹完后的队列中最后面一个数吃掉)

如果一个数进去弹出了所有的数,则这个数被吃掉的场次为0

当然,一开始是要找到从第一个开始的单调子串中的最后一个数作为这个队列的第一个数,并且场次为0

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 1e5+10;

int n,a[maxn];

struct node{
    int x,y;
}que[maxn];

int main(){
    cin >> n;
    for(int i=1; i<=n; i++)
        a[i] = read();

    int i=2;
    while(a[i]>a[i-1]) i++;
    int tail = 0, ans = 0, mx=0;
    que[tail].x = a[i-1], que[tail++].y = 0;
    for( ; i<=n; i++){
        if(a[i] < que[tail-1].x){
            que[tail].x = a[i], que[tail++].y = 1;
            ans = max(ans,que[tail-1].y);
            continue;
        }
        mx = 0;
        while(tail>0 && a[i]>que[tail-1].x) mx=max(mx,que[tail-1].y),tail--;
        que[tail].x = a[i];
        if(tail==0) que[tail++].y=0;
        else que[tail++].y=mx+1;
        ans = max(ans,que[tail-1].y);
    }
    cout << ans << endl;

    return 0;
}
时间: 2024-10-14 03:32:41

Codeforces 319B. Psychos in a Line【单调栈】的相关文章

Codeforces 319B. Psychos in a Line【栈】

题目大意: 一串数列,每一个值如果大于相邻右一位的值的话,那么就可以把右边这个值"吃掉"(右一位消失,原来的值不变),问需要吃多少次才能到达无法再吃的状态. 做法: 利用栈.遍历一遍数组,处理每个值的时候,如果栈顶的元素小于该值,那么将其弹出,知道栈顶元素大于该值或者栈为空,栈内的每个元素记录下一个属性:他是在第几次被"吃掉",进栈的新元素的被吃次数就是它弹出去的元素中的属性的最大值+1,如果没有弹任何值则为1:如果栈空,则值为0: 代码: #include <

Codeforces Round #189 (Div. 1) B. Psychos in a Line 单调队列

B. Psychos in a Line Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/319/B Description There are n psychos standing in a line. Each psycho is assigned a unique integer from 1 to n. At each step every psycho who h

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

Codeforces 802I Fake News (hard) (SA+单调栈) 或 SAM

原文链接http://www.cnblogs.com/zhouzhendong/p/9026184.html 题目传送门 - Codeforces 802I 题意 求一个串中,所有本质不同子串的出现次数的平方和. $|s|\leq 10^5$ 题解 首先,这一题用$SAM$做就是模板题,比较简单. 但是,本着练一练$SA$的心态,我开始了$SA+单调栈$的苦海. 真毒瘤. 这里讲一讲$SA$的做法,也是经典的做法. $SA$闭着眼睛先写了再说. 首先,我们考虑出现次数大于$1$次的子串. 考虑按

CF 319B Psychos in a Line 【单调队列】

给出一排神经病的编号1-n的某个排列 给出规则 一步能同时消除该数右边连续的小于该数的数 问几步能消到最后状态 在纸上试了试,觉得这个问题很有点像lis,但是苦于方法 突然看了一眼tags 单调队列 oh it is 可以把这些数字一个一个的加入单调队列中 同时记录每个数字被吃掉的场次 保持整个队列递减 策略如下 如果一个数进去没有弹出数,则这个数肯定是第一场就被消掉的 如果一个数进去弹出了一些数,则该数被吃掉的场次等于它弹走的所有数中最大的被吃掉的场次序号+1 因为,这个数肯定是在它弹掉的数之

CodeForces 548D 单调栈

Mike and Feet Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 548D Appoint description: Description Mike is the president of country What-The-Fatherland. There are n bears living in this

[Codeforces Round #622 (Div. 2)] - C2. Skyscrapers (hard version) (单调栈)

[Codeforces Round #622 (Div. 2)] - C2. Skyscrapers (hard version) (单调栈) C2. Skyscrapers (hard version) time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standard output This is a harder version of the probl

Codeforces Round #305 (Div. 2)D---Mike and Feet(单调栈)

Mike is the president of country What-The-Fatherland. There are n bears living in this country besides Mike. All of them are standing in a line and they are numbered from 1 to n from left to right. i-th bear is exactly ai feet high. A group of bears

Imbalanced Array CodeForces - 817D (思维+单调栈)

You are given an array a consisting of n elements. The imbalance value of some subsegment of this array is the difference between the maximum and minimum element from this segment. The imbalance value of the array is the sum of imbalance valuesof all