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

#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
#define db double
#define N 100010
#define lowbit(x) ((x)&(-x))
using namespace std; const db eps=1e-8;
int n,v[N],L,C,p[N];
ll cyl[N],Ans,m,tree[N];
struct info{
db num;
int id;
friend bool operator < (info a,info b){
return a.num<b.num;
}
}A[N]; void add(int x){for(;x<=n;x+=lowbit(x)) tree[x]++;}
ll sum(int x){ll r=0;for(;x;x-=lowbit(x)) r+=tree[x];return r;} int main(){
scanf("%d%d%d",&n,&L,&C);
for(int i=1;i<=n;++i) scanf("%d",&v[i]);
sort(v+1,v+n+1);
db t=(db)(L*1ll*C)/(db)v[n];
for(int i=1;i<=n;++i){
cyl[i]=(ll)(t*v[i]/C);
Ans+=(i-1)*cyl[i]-m;
m+=cyl[i];
A[i].num=(db)(t*v[i]/C)-(db)cyl[i];
A[i].id=i;
}
sort(A+1,A+n+1);
int cnt=0;
for(int i=1;i<=n;++i){
if(!(fabs(A[i].num-A[i-1].num)<eps)||i==1) ++cnt;
p[A[i].id]=cnt;
}
for(int i=1;i<=n;++i){
Ans-=sum(n)-sum(p[i]);
add(p[i]);
}
printf("%lld\n",Ans);
return 0;
}

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. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  2. GMF常见问题

    1.问题:连接线旁边没有文字标签和箭头 文字标签:在gmfmap里的Connection Mappping下增加Label Mapping元素:箭头:在gmfgraph里为Polyline Conne ...

  3. centos7.2 linux 64位系统上安装mysql

    1.在线安装mysql 在终端中命令行下输入(在官网下载mysql): # wget https://dev.mysql.com/downloads/repo/yum/mysql57-communit ...

  4. Nginx学习——Nginx简单介绍和Linux环境下的安装

    一:Nginx的简介 百科百科:Nginx Nginx 是一个俄罗斯的哥们开发的,并将其进行了开源. Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器, ...

  5. Twitter的分布式系统中ID生成方法——Snowflake

    Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...

  6. 使用python实现后台系统的JWT认证(转)

    今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良. 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的.认 ...

  7. jQuery经典案例

    示例1:鼠标点击左侧菜单实现打开和关闭功能: html及css代码部分: <!DOCTYPE html> <html lang="en"> <head ...

  8. Codeforces Round #420 (Div. 2)

    /*************************************************************************************************** ...

  9. ESLint可共享配置发布,团队自定义ESLint规则新鲜出炉

    ESLint于2013年6月份推出,至今4个年头,最新版本v4.8.0.它是目前主流的用于Javascript和JSX代码规范检查的利器,很多大公司比如Airbnb和Google均有一套自己的Java ...

  10. MongoDB学习教程(1)

    1.简介: MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展的高性能数据 ...