HDU 6136 Death Podracing(循环链表)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=6136
【题目大意】
一堆人在操场上跑步,他们都有一定的速度和初始位置,
当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时候游戏结束,
问时长为多少
【题解】
我们发现每次发生碰撞的一定是相邻的两个人,
所以我们找出相邻关系中最先发生碰撞的,将碰撞失败的那个人删除,
之后继续这个过程,
按照上述的做法我们建立一个循环链表,把所有人串起来,
当发生淘汰的时候把那个人从循环链表中删去即可,
用优先队列维护相邻关系,每次出队最小相遇时间即可。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N=100010,INF=0x3f3f3f3f;
struct data{int d,v,pw;}p[N];
bool cmp(data a,data b){return a.d<b.d;}
int T,Del[N],n,L,nxt[N],pre[N];
struct Frac{
int Den,Num;
Frac(){}
Frac(int _Num,int _Den){Den=_Den;Num=_Num;}
bool operator <(const Frac &rhs)const{return 1LL*Num*rhs.Den<1LL*rhs.Num*Den;}
};
Frac Cal(data a,data b){
int V=b.v-a.v,D=a.d-b.d;
if(D<0)D+=L; if(V<0)V=-V,D=L-D;
if(V==0)return Frac(INF,1);
int GCD=__gcd(V,D);
return Frac(D/GCD,V/GCD);
}
struct Relt{
int a,b;Frac t;
Relt(){}
Relt(int _a,int _b,Frac _t){a=_a;b=_b;t=_t;}
bool operator < (const Relt &x)const{return x.t<t;}
};
priority_queue<Relt> Q;
void Out(int x){
Del[x]=1;
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
Q.push(Relt(pre[x],nxt[x],Cal(p[pre[x]],p[nxt[x]])));
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&L);
memset(Del,0,sizeof(Del));
for(int i=0;i<n;i++)scanf("%d",&p[i].d),p[i].pw=i;
for(int i=0;i<n;i++)scanf("%d",&p[i].v);
sort(p,p+n,cmp); while(!Q.empty())Q.pop();
for(int i=0;i<n;i++){
nxt[i]=(i+1)%n; pre[i]=(i-1+n)%n;
Q.push(Relt(i,nxt[i],Cal(p[i],p[nxt[i]])));
}int Lft=n; Frac Ans;
while(Q.size()){
Relt x=Q.top(); Q.pop();
if(Del[x.a]||Del[x.b])continue;
if(--Lft==1){Ans=x.t;break;}
if(p[x.a].pw>p[x.b].pw)Out(x.b);
else Out(x.a);
}printf("%d/%d\n",Ans.Num,Ans.Den);
}return 0;
}
HDU 6136 Death Podracing(循环链表)的更多相关文章
- HDU 6136 Death Podracing (堆)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6136 题解 完了,普及题都不会做了... 发现一个重要性质是只有相邻的人才会相撞,于是直接拿堆维护即可 ...
- HDU 5860 Death Sequence(死亡序列)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5860 Death Sequence(递推)
HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...
- 2016 Multi-University Training Contest 10 || hdu 5860 Death Sequence(递推+单线约瑟夫问题)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 题目大意:给你n个人排成一列编号,每次杀第一个人第i×k+1个人一直杀到没的杀.然后 ...
- hdu 5860 Death Sequence(递推+脑洞)
Problem Description You may heard of the Joseph Problem, the story comes from a Jewish historian liv ...
- HDU 5860 Death Sequence
用线段树可以算出序列.然后o(1)询问. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<c ...
- 字符串(AC自动机):HDU 5129 Yong Zheng's Death
Yong Zheng's Death Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/O ...
- HDU 5129 Yong Zheng's Death
题目链接:HDU-5129 题目大意为给一堆字符串,问由任意两个字符串的前缀子串(注意断句)能组成多少种不同的字符串. 思路是先用总方案数减去重复的方案数. 考虑对于一个字符串S,如图,假设S1,S2 ...
- HDU 6140 17多校8 Hybrid Crystals(思维题)
题目传送: Hybrid Crystals Problem Description > Kyber crystals, also called the living crystal or sim ...
随机推荐
- NYOJ 2 括号配对问题 (模拟)
题目链接 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S ...
- VS 2010 应用程序无法启动
其实一般遇到这种问题, 不管是debug还是release, 也不用看提示的内存地址, 首先应该想到库是否包含正确. 一个可能的错误就是32位或64位不匹配的错误. 比如环境变量设的是64位的Open ...
- 打表找规律C - Insertion Sort Gym - 101955C
题目链接:https://cn.vjudge.net/contest/273377#problem/C 给你 n,m,k. 这个题的意思是给你n个数,在对前m项的基础上排序的情况下,问你满足递增子序列 ...
- 笔记本自开wifi设置
笔记本自开wifi设置 是这样的有些笔记本他自身就可以放出热点供其他的小伙伴们连接,不用非得去下专门的工具有些笔记本的网卡是自带支持双收发的(这里注意我指的是有些笔记本不是全部) 命令我已经写出来了 ...
- python基础===python自带idle的快捷键
Ctrl + [ Ctrl + ] 缩进代码Alt+3 Alt+4 注释.取消注释代码行Alt+5 Alt+6 切换缩进方式 空格<=>TabAlt+/ 单词完成,只要文中出现过,就可 ...
- python之smtplib库学习
# -*- coding:utf-8 -*- import smtplibfrom email.mime.text import MIMETextfrom email import encodersf ...
- MySQL 约束类型
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性. MYSQL中,常用的几种约束: 约束类型: 主键 外键 唯一 非空 自增 默认值 关键字: primary key ...
- Homestead在windows7 下的搭建
遇到的问题有 1.Homestead 的版本问题,教程git版本是 v5,最新是v7的,如果用最新,就要求vagrant的版本是 2.0的: 2.启动homestead后,出现 No input fi ...
- js获取系统时间
//------------------------------------获取系统日期时间 var oDate=new Date(); //alert(oDate.getFullYear());// ...
- Linux Shell基础篇——变量
一.Shell中的变量 注:这里所说的Shell是Bash Shell,我姑且统称为Shell. Shell中的变量分为用户自定义变量.环境变量.位置参数变量.预定义变量.在Shell中,变量的默认类 ...