【USACO Open 2012银】跑步Running laps (jzoj第四题)(变态)
2017-03-17 21:26
344 查看
题目:
题目描述
FJ觉得赛马很无聊,于是决定调查将赛牛作为一种运动的可能性。他安排了N(1 <= N <= 100,000)头奶牛来进行一个L圈的赛牛比赛,比赛在一个环形的长度为C的跑道上进行。所有的奶牛在跑道上的同一个点出发,每头奶牛的速度不同,当最快的奶牛跑完L*C的距离后结束。
FJ注意到了一头奶牛超过另一头奶牛这种情况的发生,并且他想知道这种“超车事件”在整个比赛中发生了多少次。更明确地,一次超车事件被定义为一对奶牛(x, y)和一个时刻t(小于等于结束时刻),且t时刻奶牛x超越到了奶牛y的前面,请帮助FJ计算整个比赛过程中“超车事件”发生的次数。
输入
第1行,3个空格隔开的整数N、L、C(1 <= L,C <= 25,000)
第2行至第n + 1行,第i + 1行有一个整数,表示第i个奶牛的速度,范围在1..1000000之间
输出
超车总数
样例输入
4 2 100
20
100
70
1
样例输出
4
作者思路:先把速度排序,求出比赛时间,然后求答案。用t[i]表示剩下时间,s[i]表示超过圈数。注意还要处理小数。
代码:
题目描述
FJ觉得赛马很无聊,于是决定调查将赛牛作为一种运动的可能性。他安排了N(1 <= N <= 100,000)头奶牛来进行一个L圈的赛牛比赛,比赛在一个环形的长度为C的跑道上进行。所有的奶牛在跑道上的同一个点出发,每头奶牛的速度不同,当最快的奶牛跑完L*C的距离后结束。
FJ注意到了一头奶牛超过另一头奶牛这种情况的发生,并且他想知道这种“超车事件”在整个比赛中发生了多少次。更明确地,一次超车事件被定义为一对奶牛(x, y)和一个时刻t(小于等于结束时刻),且t时刻奶牛x超越到了奶牛y的前面,请帮助FJ计算整个比赛过程中“超车事件”发生的次数。
输入
第1行,3个空格隔开的整数N、L、C(1 <= L,C <= 25,000)
第2行至第n + 1行,第i + 1行有一个整数,表示第i个奶牛的速度,范围在1..1000000之间
输出
超车总数
样例输入
4 2 100
20
100
70
1
样例输出
4
作者思路:先把速度排序,求出比赛时间,然后求答案。用t[i]表示剩下时间,s[i]表示超过圈数。注意还要处理小数。
代码:
var t,t1:array[0..100001] of extended; v,s:array[0..100001] of int64; fuck,n,l,c,sum,ans:int64; i:longint; max:extended; procedure qsort(l,r:longint);//快排 var i,j,mid:longint; begin if l>=r then exit; i:=l; j:=r; mid:=v[i]; repeat while v[i]>mid do inc(i); while v[j]<mid do dec(j); if i<=j then begin v[0]:=v[i]; v[i]:=v[j]; v[j]:=v[0]; inc(i); dec(j); end; until i>j; qsort(l,j); qsort(i,r); end; procedure megen(x,y:longint);//归并 var mid,i,j,k:longint; begin if x=y then exit; mid:=(x+y) div 2; megen(x,mid); megen(mid+1,y); i:=x; j:=mid+1; k:=x; while (i<=mid)and(j<=y) do if t[i]-t[j]>-0.0000001 then begin t1[k]:=t[i]; inc(i); inc(k); end else begin t1[k]:=t[j]; inc(j); inc(k); fuck:=fuck+mid-i+1; end; while (i<=mid) do begin t1[k]:=t[i]; inc(i); inc(k); end; while j<=y do begin t1[k]:=t[j]; inc(j); inc(k); end; for i:=x to y do t[i]:=t1[i]; end; begin {assign(input,'running.in'); assign(output,'running.out'); reset(input); rewrite(output); } read(n,l,c); for i:=1 to n do read(v[i]); qsort(1,n); max:=l*c/v[1];//比赛时间 for i:=1 to n do begin s[i]:=trunc(v[i]*max/c); l:=s[i]*c; t[i]:=v[i]*max-l; end; for i:=n downto 1 do begin sum:=sum+(n-i)*(s[i]-s[i+1]); ans:=ans+sum; end; megen(1,n); write(ans-fuck); close(input); close(output); end.//谢谢祝子扬的指导
相关文章推荐
- 【USACO 2012 Open】Running Laps(树状数组)
- [USACO 2012 Open]Running Laps奶牛赛跑
- jzoj P1542 【USACO Open 2012银】跑步Running laps
- 【USACO Open 2012铜】三条直线Three lines (jzoj)
- JZOJ2935. 【USACO Open 2012 Gold Division】Balanced Cow Subsets
- jzoj P1539 【USACO Open 2012铜】三条直线Three lines
- jzoj P1540 【USACO Open 2012铜】岛屿Islands
- jzoj P1541 【USACO Open 2012银】书架Bookshelf
- [BZOJ3011][Usaco2012 Dec]Running Away From the Barn(可并堆)
- BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针
- Luogu P3054 [USACO12OPEN]跑圈Running Laps
- bzoj2679 [Usaco2012 Open]Balanced Cow Subsets折半搜索
- bzoj 2679: [Usaco2012 Open]Balanced Cow Subsets 折半搜索
- BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets
- BZOJ 3011: [Usaco2012 Dec]Running Away From the Barn( dfs序 + 主席树 )
- 【洛谷 1353】 【USACO 08 JAN】 跑步 Running
- [贪心](JZOJ)【USACO Open 2012铜】岛屿Islands
- 【BZOJ3011】[Usaco2012 Dec]Running Away From the Barn【可并堆】
- [Meet In Middle] BZOJ 2679 [Usaco2012 Open]Balanced Cow Subsets
- 【usaco 2013 open】【JZOJ 3234】 阴阳