题目:

题目描述

企鹅国正在举办全面运动会,第一项比赛就是跑步。N 个人在圆形跑道上跑步,他们都有各自的速度和起点。但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时候跑步就结束了。豆豆想知道多长时间游戏会结束?

输入格式

第一行一个整数 T 表示数据组数;
每组数据的第一行是两个整数 N 和 L ,表示参赛人数以及跑道长度。
接下来一行有 N 个不同的整数 Di,表示每个人的起点。
接下来一行有 N 个不同的整数 Vi,表示每个人的跑步速度,如果速度为负数,就是在反着跑。

输出格式

对于每组数据,以最简分数形式表示游戏结束的时间。

样例数据 1

输入  [复制]


2 4 
0 2 
3 2 
10 100 
56 89 62 71 7 24 83 1 47 52 
9 -16 34 -38 47 49 -32 17 39 -9

输出

2/1 
37/7

备注

【数据范围】
对于 30% 的数据,2≤n≤100, 1≤L≤200;
对于 60% 的数据,2≤n≤103。
对于 100% 的数据,2≤n≤105,T≤5, 1≤L≤109, 0≤Di<L, 0≤|Vi|≤109;

题解:

首先将每个人按照其位置排序··然后建立一个左右链表···

肯定是相邻的两个人先相遇···所以我们想相邻两人间的相遇时间加入到一个优先队列中···

然后每次取出对首元素,然后判断元素对应的两个人的编号大小决定删除哪一个人··然后根据这个人的左右链表加入他两旁的人的时间··并且更新链表即可··(注意用visit数组判定每个人是否被删除··如果是那么包含这个人的元素是无效的····)最后剩余的一个元素对应的两个人就是最后消除的两个人··计算答案即可···

这道题的关键是相邻的两个人先相遇···所以可以利用链表···

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+;
bool visit[N];
struct node
{
int po,id,v;
}p[N];
struct node1
{
int p1,p2;double Time;
friend inline bool operator < (node1 a,node1 b) {return a.Time>b.Time;}
};
priority_queue<node1>que;
inline int R()
{
char c;int f=,i=;
for(c=getchar();(c<''||c>'')&&c!='-';c=getchar());
if(c=='-') c=getchar(),i=-;
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f*i;
}
int T,n,L,ri[N],le[N];
inline bool cmp(node a,node b)
{
return a.po<b.po;
}
inline double calc(int a,int b)
{
if(p[a].po>p[b].po) swap(a,b);
if(p[a].v>p[b].v) return (double)(p[b].po-p[a].po)/(p[a].v-p[b].v);
else return (double)(L-p[b].po+p[a].po)/(p[b].v-p[a].v);
}
inline void del(int u)
{
visit[u]=true;ri[le[u]]=ri[u];le[ri[u]]=le[u];
}
inline int gcd(int a,int b)
{
if(b==) return a;
else return gcd(b,a%b);
}
inline void pre()
{
while(!que.empty()) que.pop();memset(visit,false,sizeof(visit));
}
int main()
{
//freopen("a.in","r",stdin);
T=R();
while(T--)
{
pre();
n=R(),L=R();
for(int i=;i<=n;i++) p[i].po=R(),p[i].id=i;
for(int i=;i<=n;i++) p[i].v=R();
sort(p+,p+n+,cmp);
for(int i=;i<=n;i++) le[i]=i-,ri[i]=i+;
le[]=n,ri[n]=;
for(int i=;i<=n;i++) que.push((node1){i,ri[i],calc(i,ri[i])});
for(int i=;i<n;i++)
{
while(visit[que.top().p1]||visit[que.top().p2]) que.pop();
node1 u=que.top();que.pop();
if(p[u.p1].id<p[u.p2].id)
{
del(u.p1);
que.push((node1){le[u.p2],u.p2,calc(u.p2,le[u.p2])});
} else
{
del(u.p2);
que.push((node1){u.p1,ri[u.p1],calc(u.p1,ri[u.p1])});
}
}
node1 u=que.top();int v1=p[u.p1].v,v2=p[u.p2].v,po1=p[u.p1].po,po2=p[u.p2].po;
if(po1>po2) swap(po1,po2),swap(v1,v2);
if(v1-v2>) cout<<(po2-po1)/gcd(po2-po1,v1-v2)<<"/"<<(v1-v2)/gcd(po2-po1,v1-v2)<<endl;
else cout<<(L-po2+po1)/gcd(L-po2+po1,v2-v1)<<"/"<<(v2-v1)/gcd(L-po2+po1,v2-v1)<<endl;
}
return ;
}

刷题总结——run(ssoj)的更多相关文章

  1. 刷题总结——date(ssoj)

    题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 小Y和小Z好不容易有机会相见啦,可是邪恶的小H却不想让他们相见.现在有一些城市,城市之间有双向路径相连,有路径相连的城市之间可以 ...

  2. 牛客网Java刷题知识点之调用线程类的start()方法和run()方法的区别

    不多说,直接上干货! 前期博客 牛客网Java刷题知识点之四种不同的方式创建线程 这里很简单 首先,系统通过调用线程类的start()方法来启动一个线程,此时这个线程处于就绪状态,而非运行状态,也就意 ...

  3. leetcode刷题指南

    转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...

  4. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

  5. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  6. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  7. Sublime Text3 配置C++(附oj刷题常用模板)

    # 下载对应平台的sublime sublime最新版下载, 字体样式个人喜欢Consolas, 另附注册码: -– BEGIN LICENSE -– TwitterInc 200 User Lice ...

  8. Buu刷题

    前言 希望自己能够更加的努力,希望通过多刷大赛题来提高自己的知识面.(ง •_•)ง easy_tornado 进入题目 看到render就感觉可能是模板注入的东西 hints.txt给出提示,可以看 ...

  9. [BUUCTF-Pwn]刷题记录1

    [BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...

随机推荐

  1. FiraCode 字体 => 箭头函数变成 整体 还有 等于 不等于

    https://github.com/tonsky/FiraCode Enable in Settings → Editor → Color Scheme → Color Scheme Font →  ...

  2. CPP-网络/通信:经典HTTP协议详解

    2008-11-03 09:11 by Hundre, 266688 阅读, 23 评论, 收藏, 编辑 转自:http://blog.csdn.net/gueter/archive/2007/03/ ...

  3. Forbidden You don't have permission to access /phpStudyTest/application/index/controller/Index.php on this server.

    发生情况:将thinkPHP从官网上下了  http://thinkphp.cn 然后安装了phpstudy和PHPstorm,并将thinkPHP解压到www路径下 在用PHPstorm打开 thi ...

  4. 空类生成对象输出的结果是什么? toString()输出 覆写Object toString()方法输出的结果是什么

    空类生成对象输出的结果是什么? 输出的是对象在内存空间地址的哈希值 com.swift.P@1db9742 空类生成对象toString()输出的结果是什么? 输出的是对象在内存空间地址的哈希值的字符 ...

  5. CNCF 有哪些具体的项目内容?

    前言:CNCF(Cloud Native Computing Foundation)于 2015 年 7 月成立,隶属于 Linux 基金会,初衷围绕“云原生”服务云计算,致力于维护和集成开源技术,支 ...

  6. 【android】android对位图文件的支持

    Android 支持以下三种格式的位图文件:.png(首选)..jpg(可接受)..gif(不建议).

  7. 7.Yii2.0框架自定义全局工具函数

    功能: 新建共用方法的打印方法,可以很方便的格式化打印 一.新建helper/function.php <?php /** * Created by Haima. * Author:Haima ...

  8. 按键精灵安卓版 tap、touch命令 不好用的解决办法!

    用按键精灵手机版写脚本来操作新浪微博APP,在关注列表页自动取消关注,代码如下: If x > -1 And y > -1 Then delay 1000 tap x,y delay 10 ...

  9. python基础-面向对象的三大特征

    继承 单继承 父类 基类 子类 派生类 继承:是面向对象软件技术当中的一个概念,如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”. ...

  10. Python3 S.join() 个人笔记

    S.join(iterable) S:需要的分隔符 iterable:被分割对象 . 注意括号里必须只能有一个成员,比如 ','.join('a','b') 这种写法是行不通的 实例:'-'.join ...