USACO奶牛赛跑(逆序对)
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奶牛赛跑(逆序对)的更多相关文章
- [USACO]奶牛赛跑(逆序对)
Description 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈 ...
- 【USACO 2012 Open】奶牛赛跑_题解
奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...
- [USACO 2011 Nov Gold] Above the Median【逆序对】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91 这一题我很快的想出了,把>= x的值改为1,< x的改为- ...
- 【树状数组逆序对】USACO.2011JAN-Above the median
[题意] 给出一串数字,问中位数大于等于X的连续子串有几个.(这里如果有偶数个数,定义为偏大的那一个而非中间取平均) [思路] 下面的数据规模也小于原题,所以要改成__int64才行.没找到测试数据, ...
- BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对
BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对 题意: 奶牛的图片 Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片, ...
- P2995 [USACO10NOV]牛的照片(树状数组,逆序对)
题目: P2995 [USACO10NOV]牛的照片Cow Photographs P4545 [USACO10NOV]奶牛的图片Cow Photographs SP7809 COWPIC - Cow ...
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- CH Round #72 奇数码问题[逆序对 观察]
描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...
- POJ3928Ping pong[树状数组 仿逆序对]
Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3109 Accepted: 1148 Descrip ...
随机推荐
- 枚举类TimeUnit
枚举类TimeUnit 全路径为 java.util.concurrent.TimeUnit TimeUnit 主要用于通知基于时间的方法如何解释给定的计时参数 举例如下 如果 lock 不可用,则以 ...
- 自定义工作流活动报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- 接口interface,接口继承implements
php中,只支持从一个类继承,不支持从两个或者更多的类同时继承.从两个或者两个以上的类继承的能力被称为多重继承.php在设计上是禁止这种功能的.原因在于,避免多个类带来的复杂性.当发现需要从两个或者更 ...
- js的严格模式详解
什么是js的严格模式? 严格模式指的是使js在更为严格的条件下运行.严格模式的主要作用是规范我们写代码习惯,以及为js升级做好铺垫. 如何使用严格模式? <script> //直接在代码 ...
- Java环境配置小记
今年新开Java课程第一步就是-配置环境 博客开坑,就从Java的环境配置开始好了 以下是正式的步骤 首先,从Oracle的官网下载jdk的安装包 点我下载Java SE开发套件 先点接受许可协议,然 ...
- Vue状态管理vuex
前面的话 由于多个状态分散的跨越在许多组件和交互间各个角落,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue提供了vuex.本文将详细介绍Vue状态管理vuex 引入 当访问数据对象时,一个 V ...
- python对列表的联想
python的列表与字典,已经接触无数次了.但是很多用法都记不住,个人觉得归根原因都是只是学了知识点而少用,也少思考.在此试图用宫殿记忆法对它们的用法做个简单的梳理. 首先,说说列表的删除,删除有三种 ...
- Postgresql在线备份和恢复
1.实验环境 OS: RedHat Linux Enterprisedb 6.3 DB: postgresql 9.3 PGHOME: /opt/PostgreSQL/9.3 PGDATA: /opt ...
- js X年X周 转成 具体日期
function getWeekDate(theyear,weekcount) { var year = theyear; var week = weekcount; if(year=="& ...
- Win CE 6.0 获取手持机GPS定位1----基础知识 (C#)
一.GPS全球定位系统的组成 (1)GPS卫星(空间部分) 由沿接近环形的地球轨道运行的24颗卫星组成,位于距地表20200千米的高空,均匀分布在6个轨道面上(每个轨道面4颗),轨道倾角55度.此外, ...