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

3

7

4

12

2

输入解释:

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

Sample Output

5

3+0+1+0+1=5

HINT

Source

Silver

题解:其实可以用单调队列稍微改一下的单调堆做。可是傲娇的我偏不,嗯哼——建立一棵线段树树,在初始化之后只要支持一种萌萌哒功能就够了:在区间内查找位置最靠左的大于或等于某值的点的位置,比如样例,则cash(1,n,1,2,n,10)得到的就是5,然后萌萌哒线段树树就这么萌萌哒Accept了(本以为会小小的TLE一下的,可一遍下来居然WA,再一看居然是数组开小了TT,最终出乎本萌妹意料的——604ms不解释)

 1 var
 2    i,k,m,n:longint;
 3    l,j:int64;
 4    a,b,c:array[0..500000] of longint;
 5 function min(x,y:longint):longint;
 6          begin
 7               if x<y then min:=x else min:=y;
 8          end;
 9 function max(x,y:longint):longint;
10          begin
11               if x>y then max:=x else max:=y;
12          end;
13 procedure built(x,y,z:longint);
14           begin
15                if x=y then
16                   begin
17                        a[z]:=c[x];
18                        b[z]:=x;
19                        exit;
20                   end;
21                built(x,(x+y) div 2,z*2);
22                built((x+y) div 2+1,y,z*2+1);
23                a[z]:=max(a[z*2],a[z*2+1]);
24                if a[z]=a[z*2] then b[z]:=b[z*2] else b[z]:=b[z*2+1];
25           end;
26 function cash(x,y,z,l,r,t:longint):int64;
27          var
28             i,j,k:longint;
29          begin
30               if l>r then exit(-1);
31               if a[z]<t then exit(-1);
32               if (c[l]>=t) then exit(l);
33               if (l=r) or (x=y) then exit(-1);
34               i:=cash(x,(x+y) div 2,z*2,l,min((x+y) div 2,r),t);
35               if i=-1 then
36                  cash:=cash((x+y) div 2+1,y,z*2+1,max((x+y) div 2+1,l),r,t)
37               else
38                   cash:=i;
39          end;
40 begin
41      readln(n);
42      for i:=1 to n do
43          readln(c[i]);
44      built(1,n,1);
45      l:=0;
46      for i:=1 to n-1 do
47          begin
48               j:=(cash(1,n,1,i+1,n,c[i]));
49               if j=-1 then l:=l+int64(int64(n)-int64(i)) else l:=l+int64((int64(j)-int64(i))-1);
50          end;
51      writeln(l);
52 end.
时间: 2024-08-07 18:19:29

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 )

[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

【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

[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

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

BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排

1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 400  Solved: 290[Submit][Status] Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫

bzoj1726 [Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 826  Solved: 394[Submit][Status] Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向

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"