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

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

Time Limit: 2 Sec  Memory Limit: 64 MB
Submit: 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 Input

6
10
3
7
4
12
2

输入解释:

六头牛排成一排,高度依次是 10, 3, 7, 4, 12, 2。

Sample Output

5

3+0+1+0+1=5

HINT

Source

Silver

Analysis

单调栈

= =我是先知道是什么再去学的怎么做的

那么我们现在有这么个数列 10 3 7 4 12 2

如下:

对于身高10米的奶牛(也就是 1 号),显然在 12 米的 5 号奶牛之前的奶牛都会被计数到 1 号奶牛那里

定义 see( i ) 为每个奶牛能看到的最远的位置

那么 c 就是 see(i)-i ,最后一次性统计或者什么都很方便

于是某些东西就有了单调性

突然发现自己解释不清

建立一个单调栈,保持栈底的元素比栈顶的大

那么从右往左扫描的时候,将元素一个个按这个法则压进去,如果栈顶元素比当前元素 “高” ,就弹出。

当栈顶元素比当前元素大的时候,栈顶元素就是那个 “能挡住 1 号的 5 号”

那么当前元素的 see 值就是栈顶元素的位置-1

自行体悟!!

Code

 1 /**************************************************************
 2     Problem: 1660
 3     User: child
 4     Language: C++
 5     Result: Accepted
 6     Time:108 ms
 7     Memory:24724 kb
 8 ****************************************************************/
 9
10 #include<cstdio>
11 #include<iostream>
12 #define maxn 1000000
13 using namespace std;
14
15 long long high[maxn],see[maxn],n,ans;
16 long long stack[maxn],st_poi;
17
18 int main(){
19     scanf("%lld",&n);
20     for(int i = 1;i <= n;i++){
21         scanf("%lld",&high[i]);
22     }
23
24     for(int i = n;i >= 1;i--){
25         while(high[stack[st_poi-1]] < high[i] && st_poi)
26             st_poi--;
27         if(st_poi) see[i] = stack[st_poi-1]-1;
28         else see[i] = n;
29         stack[st_poi++] = i;
30     }
31
32     for(int i = 1;i <= n;i++){
33 //      printf("%d ",see[i]);
34         ans += see[i]-i;
35     }
36
37     printf("%lld",ans);
38
39     return 0;
40 }

心情不好qwq

时间: 2024-10-10 12:36:53

[BZOJ] 1660: [Usaco2006 Nov]Bad Hair Day 乱发节的相关文章

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

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

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

【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

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

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

[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

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序.她们甚至也不能通过仍硬币的方式. 所以她们通过"round number"竞赛的方式.第一头牛选取一个整数,小于20亿.第二头牛也这样选取一个整数.如果这两个数都是 "round numbers"

BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板

题目 1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50,000).然后,FJ去买了一块很长的木板,它的长度正好等于所有需要的木板的长度和.接下来的工作,当然是把它锯成需要的长度.FJ忽略所有切割时的损失—

BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )

从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ----------------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue&g