//请忽略我把牛看作羊....

由题意,我们可以得到 t*vi-t*vj=kC.那么i,j相遇的次数就是最大的k(整数).为了得到最大的k就要使t最大,而tmax=L*C/vmax.

那么 把式子整理得到:

k=L*(vi-vj)/vmax.(向下取整)

对于第i只,它和速度比它小的每一只羊相遇的次数都能确定,

常见的思路就是运用前缀和把式子累加,但由于k是每两只羊之间运算取整的结果,加到一起后,答案会发生变化.所以不能单单相加运算,我们可以算出累加算法对正确答案产生的影响.

先看两个式子:

A1=[a*t+b-(c*t+d)]/t 与A2= (a*t+b)/t-(c*t+d)/t(a,c为整数;b,d∈[0,t-1])

变形得:

A1=[(a-c)*t+b-d]/t

A2=a-c.

只有当b-d<0,即b<d时A1!=A2且A1=A2-1.

现在我们来看原题:

当L*C*(vi-vj)/(vmax*C)变为

( L*C*vi)/(vmax*C)- ( L*C*vi)/(vmax*C)时,答案会不会改变取决于L*C*vi和L*C*vj除vmax*C的余数大小关系.

如果前者小于后者,答案要减去1.

我们按照速度从大到小枚举每一只羊i

对于羊i的答案 =(i-1)*L*vi/vmax-L*sumv[i-1]/vmax-cnt.

此处cnt表示余数大于羊i的余数,且速度小于羊i的个数.

我们将余数x排序.再用树状数组维护v<vi,且x>xi的个数就可以啦.

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;
const int M=1e5+5;
const int N=1e6+5;
int n,L,vmx,C;
int val[M],tot=0;
struct node{int v,p;ll mod;
}A[M];
void add(int x){//树状数组更新 while(x<=tot){val[x]++;x+=x&(-x);}
}
int sum(int x){//树状数组求和 int res=0;while(x>0){res+=val[x];x-=x&(-x);}return res;
}
bool cmp1(node a,node b){ return a.v<b.v; }//按照速度排序
bool cmp2(node a,node b){ return a.mod<b.mod; }// 按照余数排序
int main(){int i,j;scanf("%d %d %d",&n,&L,&C);for(i=1;i<=n;i++){scanf("%d",&A[i].v);vmx=max(vmx,A[i].v);//z找到最大的速度 }
for(i=1;i<=n;i++)A[i].mod=1ll*L*C*A[i].v%(1ll*C*vmx);//sort(A+1,A+1+n,cmp2);for(i=1;i<=n;i++){tot++;for(j=i;j<=n;j++){if(A[j].mod!=A[i].mod)break;A[j].p=tot;}i=j-1;}sort(A+1,A+1+n,cmp1);ll sum_pre=0,res=0;for(i=1;i<=n;i++){ll tmp=1ll*L*A[i].v/vmx; ll ans=tmp*(i-1)-sum_pre+sum(A[i].p)-i+1;sum_pre+=tmp;add(A[i].p);res+=ans;}cout<<res<<endl;return 0;
}

USACO2011Open Silver Running Laps题解相关推荐

  1. [USACO 2012 Open]Running Laps奶牛赛跑

    题目链接:找不到QWQhttp://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4074 [在一个并没有 ...

  2. jzoj P1542 【USACO Open 2012银】跑步Running laps

    题目描述 FJ觉得赛马很无聊,于是决定调查将赛牛作为一种运动的可能性.他安排了N(1 <= N <= 100,000)头奶牛来进行一个L圈的赛牛比赛,比赛在一个环形的长度为C的跑道上进行. ...

  3. USACO 1月 2021-2022 January Contest Silver银组 题解

    你好啊我又又又来了 要准备usaco的铁铁们可以参考这个文章哦! 想刷好USACO--看这篇文章就够了_GeekAlice的博客-CSDN博客我最近是发现了一个很好用的网站https://blog.c ...

  4. usaco 2012 Open【Running Laps奶牛赛跑】

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

  5. 【USACO Open 2012银】跑步Running laps (jzoj第四题)(变态)

    题目: 题目描述 FJ觉得赛马很无聊,于是决定调查将赛牛作为一种运动的可能性.他安排了N(1 <= N <= 100,000)头奶牛来进行一个L圈的赛牛比赛,比赛在一个环形的长度为C的跑道 ...

  6. 逆序对——P3054 [USACO12OPEN]跑圈Running Laps

    题目描述 农夫约翰让他的 n (1 <= n <= 100,000) 头牛在长度为 c 的跑道上进行跑 l 圈的比赛,所有牛从同一起点,以不同的速度开始跑.直到当跑得最快的那一头牛跑完 l ...

  7. TOJ 4074 Running Laps -- 树状数组

    题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4074 题目大意:有n头牛在环形跑 ...

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

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

  9. Luogu P3054 [USACO12OPEN]跑圈Running Laps

    题目传送门 戳这 这道题不难发现是 (跑的快的圈数-跑的少的圈数)向下取整的总和 那么N^2算法是很显然的 怎样快点呢? 我们可以分离一下整数和小数  整数部分直接减(随便搞) 那么如果有什么 2.4 ...

最新文章

  1. python 深度 视差 计算_开源双目视觉BM算法-Matlab/Python/Javascript
  2. animate inater插件_C4D R20插件下载 旧版插件C4D R20桥接插件INSYDIUMS Plug-In Bridge Cinema 4D R20 免费版 下载-脚本之家...
  3. arm下的linux可以运行qt吗,Ubuntu平台Arm下QT环境搭建
  4. Python字典中你必须知道的用法
  5. 关于前台调用后台事件__doPostBack函数
  6. 关于 mysql.test 数据库
  7. python程序设计搜题软件_智慧职教APPPython程序设计基础答案搜题公众号
  8. 给Windows 服务添加命令行参数
  9. 对于技术焦虑的一点想法
  10. golang nats request/reply模式
  11. 虚拟终端网络工程实施纪要
  12. spring 事物配置几种
  13. 塞规公差带图_孔与轴用量规的公差带图
  14. Linux Mii management/mdio子系统分析之四 mdio总线及phy驱动模型及其开发流程
  15. 关于Video.js 出现的问题 this.el_.vjs_getProperty
  16. OCCT示例学习笔记1--Viewer2d项目
  17. Silverlight加载xap后通过反射相互调用方法及元素
  18. bi报表是什么意思,有什么优势?
  19. 细谈Type-C、PD原理(二)
  20. 中国移动互联网第一次大战盘点:360让别人不赚钱的能力很强

热门文章

  1. 英语背单词有用吗_考研英语刷真题+背单词真的有用吗?83分上岸学姐用经验告诉你...
  2. A Knight's Journey
  3. 发布Windows应用程序!试试英伟达“神笔马良”GauGAN
  4. 挖掘应用型创新人才 第六届大学生RDMA编程挑战赛正式启幕
  5. java tika pdf_TIKA提取PDF
  6. XCTF re5-packed-movement
  7. 企业邮箱申请流程,申请企业邮箱账号,怎样申请企业邮箱?
  8. Redis 常用 API
  9. React生命周期(经典)
  10. 时间序列建立图模型(四)