1660: [Usaco2006 Nov]Bad Hair Day 乱发节
2014-12-14 20:40
337 查看
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
的和。
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不解释)
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
的和。
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不解释)
var i,k,m,n:longint; l,j:int64; a,b,c:array[0..500000] of longint; function min(x,y:longint):longint; begin if x<y then min:=x else min:=y; end; function max(x,y:longint):longint; begin if x>y then max:=x else max:=y; end; procedure built(x,y,z:longint); begin if x=y then begin a[z]:=c[x]; b[z]:=x; exit; end; built(x,(x+y) div 2,z*2); built((x+y) div 2+1,y,z*2+1); a[z]:=max(a[z*2],a[z*2+1]); if a[z]=a[z*2] then b[z]:=b[z*2] else b[z]:=b[z*2+1]; end; function cash(x,y,z,l,r,t:longint):int64; var i,j,k:longint; begin if l>r then exit(-1); if a[z]<t then exit(-1); if (c[l]>=t) then exit(l); if (l=r) or (x=y) then exit(-1); i:=cash(x,(x+y) div 2,z*2,l,min((x+y) div 2,r),t); if i=-1 then cash:=cash((x+y) div 2+1,y,z*2+1,max((x+y) div 2+1,l),r,t) else cash:=i; end; begin readln(n); for i:=1 to n do readln(c[i]); built(1,n,1); l:=0; for i:=1 to n-1 do begin j:=(cash(1,n,1,i+1,n,c[i])); if j=-1 then l:=l+int64(int64(n)-int64(i)) else l:=l+int64((int64(j)-int64(i))-1); end; writeln(l); end.
相关文章推荐
- 【BZOJ1660】【Usaco2006 Nov】Bad Hair Day 乱发节
- BZOJ1660: [Usaco2006 Nov]Bad Hair Day 乱发节
- [BZOJ1660][Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)
- BZOJ 1660: [Usaco2006 Nov]Bad Hair Day 乱发节( 单调栈 )
- bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)
- bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)
- bzoj1660[Usaco2006 Nov]Bad Hair Day 乱发节
- bzoj1660[Usaco2006 Nov]Bad Hair Day 乱发节
- bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节【单调栈】
- 【BZOJ 1660】 [Usaco2006 Nov]Bad Hair Day 乱发节
- [BZOJ 1660][Usaco2006 Nov]Bad Hair Day 乱发节:单调栈
- BZOJ 1660: [Usaco2006 Nov]Bad Hair Day 乱发节
- |BZOJ 1660|单调栈|[Usaco2006 Nov]Bad Hair Day 乱发节
- 【BZOJ】1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)
- [BZOJ] 1660: [Usaco2006 Nov]Bad Hair Day 乱发节
- 【BZOJ 1660】 [Usaco2006 Nov]Bad Hair Day 乱发节
- [BZOJ1660] [Usaco2006 Nov]Bad Hair Day 乱发节
- 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(悬线法)
- BZOJ 1660: [Usaco2006 Nov]Bad Hair Day 乱发节
- [Usaco2006 Nov]Bad Hair Day 乱发节