题目:

题目描述

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

输入格式

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

输出格式

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

样例数据 1

输入  [复制]

2 
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. UVA 11572 Unique snowflakes (滑窗)

    用set,保存当前区间出现过的数字,如果下一个数字没有出现过,加入,否则删掉左端点,直到没有重复为止 #include<bits/stdc++.h> using namespace std ...

  2. 原型模式 -- JavaScript语言的灵魂

    原型模式就是将原型对象指向创建对象的类,使这些类共享原型对象的方法与属性.JS是基于原型链实现对象之间的继承,是对属性或者方法的共享,而不是对属性和方法的复制. // 图片轮播类 var LoopIm ...

  3. C08 C语言预处理命令

    目录 宏定义 文件包含 条件编译 预处理命令 C语言的预处理:在编译之前进行的处理,不进行编译. C语言的预处理功能有: 宏定义 文件包含 条件编译 预处理命令以符号“#”开头.. 宏定义 不带参数的 ...

  4. 安装JDK1.8以及配置环境变量的步骤

    一. 首先到官网下载jdk1.8,下载的版本分为windows和linux,这里需要安装操作系统进行下载.我的是64位就下载x64,32位系统则下载x86 二. 然后就是安装,双击进行安装,这里不用更 ...

  5. Bootstrap历练实例:默认的面板(Panels)

    Bootstrap 面板(Panels) 本章将讲解 Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素 ...

  6. 基于arcgis api for js高速公路智能化智慧公路养护WebGIS开源系统

    伴随着高速公路建设进程加快,其涉及信息量增大.类型多样.地点分布广,传统的信息管理方式已不适应公路建设迅速发展的需要,而目前能对高速公路在设计.施工.养护等阶段的各类信息综合进行管理的信息系统尚较少见 ...

  7. cocos2dx 单张图片加密

    cocos2dx 已经封装好读取加密的prv文件的方法,打开texturepacker,导入一张图片,在content protection中写入密钥,在texture format中选择prv格式 ...

  8. UIViewController 的 edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets属性

    1.有时你命名设置了某控件的y坐标为0,确总是被导航栏遮挡住,如下: UILabel *label = [[UILabel alloc] init];    label.text = @"请 ...

  9. 【转】C++后台开发应该读的书

    转载自http://www.cnblogs.com/balloonwj/articles/9094905.html 作者 左雪菲 根据我的经验来谈一谈,先介绍一下我的情况,坐标上海,后台开发(也带团队 ...

  10. How To Add Swap Space on Ubuntu 16.04

    Introduction One of the easiest way of increasing the responsiveness of your server and guarding aga ...