BZOJ 1660 乱发节

单调栈。ans开long long。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 80050
using namespace std;
int n,a[maxn],stack[maxn],top=0;
long long ans=0;
int main()
{
    scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    for (int i=n;i>=1;i--)
    {
        while ((top) && (a[i]>a[stack[top]]))
            top--;
        if (top) ans+=stack[top]-i-1;
        else ans+=n-i;
        stack[++top]=i;
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-10-10 12:18:09

BZOJ 1660 乱发节的相关文章

BZOJ 1660: [Usaco2006 Nov]Bad Hair Day 乱发节( 单调栈 )

维护一个h严格递减的栈 , 出栈时计算一下就好了.. -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<stack> #include<iostream> #define rep( i , n )

【BZOJ 1660】 [Usaco2006 Nov]Bad Hair Day 乱发节

1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 678  Solved: 326 [Submit][Status][Discuss] Description Input * Line 1: 牛的数量 N. * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度. Output * Line 1: 一个整数表示c[1] 至 c[N]的和. Sample In

[BZOJ] 1660: [Usaco2006 Nov]Bad Hair Day 乱发节

1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1207  Solved: 591[Submit][Status][Discuss] Description Input * Line 1: 牛的数量 N. * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度. Output * Line 1: 一个整数表示c[1] 至 c[N]的和. Sample Inp

1660: [Usaco2006 Nov]Bad Hair Day 乱发节

1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 665  Solved: 318 [Submit][Status] Description Input * Line 1: 牛的数量 N. * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度. Output * Line 1: 一个整数表示c[1] 至 c[N]的和. Sample Input 6 10

BZOJ1660: [Usaco2006 Nov]Bad Hair Day 乱发节

1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 606  Solved: 289[Submit][Status] Description Input * Line 1: 牛的数量 N. * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度. Output * Line 1: 一个整数表示c[1] 至 c[N]的和. Sample Input 6 10 3

[Usaco2006 Nov]Bad Hair Day 乱发节

Description 农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都意识到自己凌乱不堪的发型,FJ 希望统计出能够看到其他牛的头发的牛的数量. 每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向同一方向排成一排.第i头牛可以看到第i+1,i+2头牛,只要他们的高度严格小于第i头牛,并且中间没有其他奶牛阻挡 Input Line 1: 牛的数量 N. Lines 2..N+1: 第 i

【bzoj1660】【单调栈】Bad Hair Day 乱发节

Description Input * Line 1: 牛的数量 N. * Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度. Output * Line 1: 一个整数表示c[1] 至 c[N]的和. Sample Input 6 10 3 7 4 12 2 输入解释: 六头牛排成一排,高度依次是 10, 3, 7, 4, 12, 2. Sample Output 5 3+0+1+0+1=5 题解:维护一个单调递减栈,对于每一个元素,它对它之后的元素的贡献就是维护完栈之后

bzoj1660:乱发节

一开始就陷入误区了,因为总是想着这头牛能看到几头牛这个点去考虑,然而那样的话基本都会爆的但是又想不出怎么优化,网上的题解.从另一方面考虑就好了,就是这一头牛能被多少头牛看到再加上栈的应用就ok了. ------------------------------------------------------------------------------- #include<cstdio>#include<cstring>#include<iostream>#includ

P1660: [Usaco2006 Nov]Bad Hair Day 乱发节

还是单调栈,维护递减即可,在进行计算,注意要保存前一个比当前数大的数之前有几个比它小. 1 var n,i,j,num,now,tem:longint; 2 ans:int64; 3 stack:array[0..1000001] of longint; 4 h,l:array[0..1000001] of longint; 5 begin 6 readln(n); 7 for i:=1 to n do 8 readln(h[i]); 9 now:=0; 10 ans:=0; 11 //fill