【USACO 2012 Open】Running Laps(树状数组)

53 奶牛赛跑
  约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场。所有奶牛从起点同时起跑,
奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi。只要有一头奶牛跑完 L 圈之后,比赛就立
即结束了。
有时候,跑得快的奶牛可以比跑得慢的奶牛多绕赛场几圈,从而在一些时刻超过慢的奶牛。这就
是最令观众激动的套圈事件了。请问在整个比赛过程中,套圈事件一共会发生多少次呢?
输入格式
? 第一行:三个整数 NL C, 1 N 105 , 1 L 25000 , 1 C 25000
? 第二行到第 N + 1 行:第 i + 1 行有一个整数 Vi, 1 Vi 106
输出格式
? 单个整数:表示整个比赛过程中,套圈的次数之和
样例输入
4 2 100
20
100
70
1
样例输出
4
解释
两头速度快的奶牛会超过两头速度慢的奶牛
各一次

【分析】

  稍微思考一下的题我就不会了么- -

  算出每头牛跑的圈数(double),因为都是匀速,要超过完整的一圈必须圈数完整的多1。

  但是n^2就会很慢。

  可以拆成整数部分和小数部分来做,排个序,整数部分先直接减掉前面的,小数部分求逆序对,然后在ans里面减掉。

  要用long long

代码如下:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 #define Maxn 100010
10 #define LL long long
11
12 struct node
13 {
14     double a;
15     LL id;
16 }t[Maxn];
17
18 LL c[Maxn],v[Maxn];
19
20 LL mymax(LL x,LL y) {return x>y?x:y;}
21 bool cmp(node x,node y) {return x.a<y.a;}
22 bool cmp2(node x,node y) {return x.id<y.id;}
23
24 LL n;
25
26 void add(LL x,LL y)
27 {
28     for(LL i=x;i<=n;i+=i&(-i))
29         c[i]+=y;
30 }
31
32 LL get_ans(LL x)
33 {
34     LL ans=0;
35     for(LL i=x;i>=1;i-=i&(-i))
36         ans+=c[i];
37     return ans;
38 }
39
40 int main()
41 {
42     LL l,nc;
43     scanf("%lld%lld%lld",&n,&l,&nc);
44     for(LL i=1;i<=n;i++) scanf("%d",&v[i]);
45     sort(v+1,v+1+n);
46     LL sum=0,ans=0;
47     for(LL i=1;i<=n;i++)
48     {
49         t[i].a=(double)(l*1.0*v[i]/v[n]);
50         LL x=(LL)(t[i].a);
51         ans+=(i-1)*x-sum;
52         sum+=x;
53         t[i].a=t[i].a-x;
54         t[i].id=i;
55     }
56     sort(t+1,t+1+n,cmp);
57     LL p=1;
58     double now=t[1].a;
59     t[1].a=1;
60     for(LL i=2;i<=n;i++)
61     {
62         if(t[i].a-now>0.000001) p++,now=t[i].a;
63         t[i].a=p;
64     }
65     sort(t+1,t+1+n,cmp2);
66     memset(c,0,sizeof(c));
67     for(LL i=n;i>=1;i--)
68     {
69         LL x=(LL)(t[i].a);
70         ans-=get_ans(x-1);
71         add(x,1);
72     }
73     printf("%lld\n",ans);
74     return 0;
75 }

usaco 2012 open

2016-10-28 08:35:28

时间: 2024-10-12 17:40:39

【USACO 2012 Open】Running Laps(树状数组)的相关文章

【树状数组逆序对】USACO.2011JAN-Above the median

[题意] 给出一串数字,问中位数大于等于X的连续子串有几个.(这里如果有偶数个数,定义为偏大的那一个而非中间取平均) [思路] 下面的数据规模也小于原题,所以要改成__int64才行.没找到测试数据,自己编的几组.简单来说读入每个数,大于等于中位数设为1,小于设为-1,前i个数的和建立一个树状数组,求逆序对. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorit

hdoj 1556 Color the ball(树状数组)

Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗? Input 每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <=

HDOJ 4456 Crowd 离散化+二维树状数组

将坐标旋转45度就可以得到正方形,可以用二维树状数组求解... 为了节省内存,提前将树状数组中会被更新的点全都存下来,并离散化 Crowd Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1199    Accepted Submission(s): 282 Problem Description City F in the south

树状数组(二)与poj2155 - matrix

今天下午,我进行了树状数组的进一步学习[1],并完成了poj2155的编程与调试,下面是一些记录与感想. 这道题目是一道二维树状数组的练习,中心思想如下: 1.C(x1, y1)(x2, y2)可以用c[x1][y1]++.c[x2 + 1][y1]++.c[x1][y1 + 1]--.c[x2 + 1][y2 + 1]--进行记录(证明与推理过程在注释[1]中). 2.Q(x, y)利用二维树状数组对c[1][1]到c[x][y]的累加和%2(即mod 2)求得(请各位参看注释[1]的资料自行

HDU 4325 Flowers(树状数组)

Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3150    Accepted Submission(s): 1549 Problem Description As is known to all, the blooming time and duration varies between different kinds

HDU4267 树状数组 不连续区间修改

A Simple Problem with Integers                                   Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operations

hdu4417 Super Mario 树状数组离线/划分树

http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2720    Accepted Submission(s): 1322 Problem Description Mario is world-famous plumber

hdu 4417 Super Mario(离线树状数组|划分树)

Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2584    Accepted Submission(s): 1252 Problem Description Mario is world-famous plumber. His "burly" figure and amazing jumping a

POJ1990--POJ 1990 MooFest(树状数组)

Time Limit: 1000MSMemory Limit: 30000K Total Submissions: 8141Accepted: 3674 Description Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gathering of cows from around the world. MooFest involves a variety of e

HDU4267 A Simple Problem with Integers 线段树/树状数组

HDU4267 A Simple Problem with Integers  线段树/树状数组 2012长春网络赛A题 Problem Description Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operations. One type of operation is to add a given number to a few numbers in a given interval. T