Description

约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场。所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi。只要有一头奶牛跑完 L 圈之后,比赛就立即结束了。

有时候,跑得快的奶牛可以比跑得慢的奶牛多绕赛场几圈,从而在一些时刻超过慢的奶牛。这就是最令观众激动的套圈事件了。请问在整个比赛过程中,套圈事件一共会发生多少次呢?

Input Format

• 第一行:三个整数 N ,L 和 C,1 ≤ N ≤ 10^5; 1 ≤ L ≤ 25000; 1 ≤ C ≤ 25000

• 第二行到第 N + 1 行:第 i + 1 行有一个整数 Vi,1 ≤ Vi ≤ 10^6

Output Format

单个整数:表示整个比赛过程中,套圈的次数之和

Solution

首先,如果一头牛跑的圈数比另一头牛多,那么它们的差值向下取整即为他们的收益,

容易想到\(O(n^2)\)的做法,枚举每头奶牛与其他奶牛的收益,但这样肯定超时

我们发现,对于一头牛跑的圈数\(cyl[i]\),只要找出所有比他小的值进行处理,

即\(Ans=\sum_{i=1}^nF[i], 且F[i]=\sum \bigg\lfloor cyl[i]-cyl[j]\bigg\rfloor,cyl[i]> cyl[j],1\leq i,j\leq n.\)

但这样好像也没用什么思路,

我们发现,其实\(cyl[i]-cyl[j]\)下取整是因为有小数,而不妨直接先把整数部分直接加起来,然后单独考虑小数部分(好吧也许很难想到)

我们发现,2个数的小数部分最多影响1,如果把cyl数组升序排序,那么Ans只要每次减去前面比当前小数部分小的count即可,

没错!发现变成了求逆序对,那么用树状数组或者归并排序都行

这里采用树状数组,注意离散化

Code

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #define ll long long
  5. #define db double
  6. #define N 100010
  7. #define lowbit(x) ((x)&(-x))
  8. using namespace std;
  9. const db eps=1e-8;
  10. int n,v[N],L,C,p[N];
  11. ll cyl[N],Ans,m,tree[N];
  12. struct info{
  13. db num;
  14. int id;
  15. friend bool operator < (info a,info b){
  16. return a.num<b.num;
  17. }
  18. }A[N];
  19. void add(int x){for(;x<=n;x+=lowbit(x)) tree[x]++;}
  20. ll sum(int x){ll r=0for(;x;x-=lowbit(x)) r+=tree[x];return r;}
  21. int main(){
  22. scanf("%d%d%d",&n,&L,&C);
  23. for(int i=1;i<=n;++i) scanf("%d",&v[i]);
  24. sort(v+1,v+n+1);
  25. db t=(db)(L*1ll*C)/(db)v[n];
  26. for(int i=1;i<=n;++i){
  27. cyl[i]=(ll)(t*v[i]/C);
  28. Ans+=(i-1)*cyl[i]-m;
  29. m+=cyl[i];
  30. A[i].num=(db)(t*v[i]/C)-(db)cyl[i];
  31. A[i].id=i;
  32. }
  33. sort(A+1,A+n+1);
  34. int cnt=0;
  35. for(int i=1;i<=n;++i){
  36. if(!(fabs(A[i].num-A[i-1].num)<eps)||i==1) ++cnt;
  37. p[A[i].id]=cnt;
  38. }
  39. for(int i=1;i<=n;++i){
  40. Ans-=sum(n)-sum(p[i]);
  41. add(p[i]);
  42. }
  43. printf("%lld\n",Ans);
  44. return 0;
  45. }

[USACO]奶牛赛跑(逆序对)的更多相关文章

  1. USACO奶牛赛跑(逆序对)

    Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...

  2. 【USACO 2012 Open】奶牛赛跑_题解

    奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...

  3. [USACO 2011 Nov Gold] Above the Median【逆序对】

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91 这一题我很快的想出了,把>= x的值改为1,< x的改为- ...

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

    [题意] 给出一串数字,问中位数大于等于X的连续子串有几个.(这里如果有偶数个数,定义为偏大的那一个而非中间取平均) [思路] 下面的数据规模也小于原题,所以要改成__int64才行.没找到测试数据, ...

  5. BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对

    BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对 题意: 奶牛的图片 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片, ...

  6. P2995 [USACO10NOV]牛的照片(树状数组,逆序对)

    题目: P2995 [USACO10NOV]牛的照片Cow Photographs P4545 [USACO10NOV]奶牛的图片Cow Photographs SP7809 COWPIC - Cow ...

  7. 【CQOI2011】动态逆序对 BZOJ3295

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  8. CH Round #72 奇数码问题[逆序对 观察]

    描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...

  9. POJ3928Ping pong[树状数组 仿逆序对]

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3109   Accepted: 1148 Descrip ...

随机推荐

  1. spring技术小结

    1.DI和IOC 依赖注入(Dependency Injection)还是控制反转(Inversion of Conctrol) bean通过依赖注入,注册到spring容器里面.spring容器通过 ...

  2. Lambda动态排序分页通用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  3. Maven下 SpringMvn+thymeleaf 搭建

    1.首先新建一个项目 2.根据以下选项,点击下一步 3.随便输入 4.配置maven的路径 5.点击完成 6.等待所有maven的库文件下载完成后配置pom.xml依赖 <dependency& ...

  4. 【mysql】mysql 配置

    安装完mysql后, 要及得配置一下 /etc/mysql/my.cnf 配置字符编码为utf8 [client] default-character-set = utf8 [mysqld] defa ...

  5. es6-Module 的加载实现

    浏览器加载 传统方法 在 HTML 网页中,浏览器通过<script>标签加载 JavaScript 脚本. <!-- 页面内嵌的脚本 --> <script type= ...

  6. mysql登陆远程数据库

    1.登陆mysql 2.e mysql; 3.比如用户名密码为root/root. 你想root使用root从任何主机连接到mysql服务器的话. @’ ’后面加ip地址一般般为localhost或者 ...

  7. tf warning等级

    from:http://blog.csdn.net/tsinghuahui/article/details/72938764 tf讨厌的warning 2017-08-03 10:02:52.0990 ...

  8. 如何在InstallShield的MSI工程中调用Merge Module的Custom Action

    使用InstallShield创建了合并模块安装程序,定义自定义活动,可如何调用却不太清楚,网上也就找到这点信息,还是没有成功,到底该在什么地方执行合并模块的自定义活动? http://1662487 ...

  9. java Vamei快速教程15 IO基础

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机最重要的功能是处理数据.一个有用的计算机语言需要拥有良好的IO功能,以便让未 ...

  10. 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复

    如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...