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;
}
时间: 2024-08-05 16:44:39

HDU 6136 Death Podracing(循环链表)的相关文章

hdu 6136 Death Podracing(模拟)

题目链接:hdu 6136 Death Podracing 题意: 有n个人在一个环形的跑道上,第i个人有一个power i,每个人有一个起始点和一个不同的速度. 如果两个人相遇,那么power大的那个人就会将power小的那个人淘汰出局. 然后问决出胜负需要多少时间. 题解: 显然,每次有人被淘汰出局的时候,都是被相邻的人干掉的,那么我们先预处理出相邻的人相遇的时间,然后扔进优先队列里面,每次选择最小的时间,将一个人淘汰掉,然后再更新一下当前的局势就行了. 1 #include<bits/st

HDU 6136 Death Podracing (堆)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6136 题解 完了,普及题都不会做了... 发现一个重要性质是只有相邻的人才会相撞,于是直接拿堆维护即可... WA了好几发... 代码 #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<algorithm> #define llong long

HDU 6136 Death Podracing

题意 给定长l的环上的n个人,每个人有给不相同的速度和位置,相遇时编号大的存活,问最后留存一个人时的时间 做法 直接用堆来模拟即可 #include <bits/stdc++.h> using namespace std; typedef long long LL; struct Frac { LL fz, fm; Frac() {} template<class T> Frac(T a):fz(a), fm(1) {} template<class T> Frac(T

2016 Multi-University Training Contest 10 || hdu 5860 Death Sequence(递推+单线约瑟夫问题)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 题目大意:给你n个人排成一列编号,每次杀第一个人第i×k+1个人一直杀到没的杀.然后剩下的人重新编号从1-剩余的人数.按照上面的方式杀.问第几次杀的是谁. 分析 一轮过后和原来问题比只是人的编号发生变化,故可以转化为子问题求解,不妨设这n个人的编号是0~n-1,对于第i个人,如果i%k=0,那么这个人一定是第一轮出列的第i/k+1个人:如果i%k!=0,那么这个人下一轮的编号就是i

HDU 5860 Death Sequence (递推)

题意:n个人排成一行,从第一个人开始,每个k个人报数,报到数的人被杀死,剩下的人重新排成一行再报数.一共q个询问,每次询问第qi个死的人是谁. 析:是一个约瑟夫的变形,我们要考虑子问题的问题同样编号是0-n-1,如果在某一轮,第 i 个人如果能取模 k 为0,那么这一轮他就会被干掉,如果不是 那么下一轮他就是编号为 i-i/k-1,然后再处理每一轮多少个人被干掉,就OK了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&q

HDU 5860 Death Sequence

用线段树可以算出序列.然后o(1)询问. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include&l

HDU 5129 Yong Zheng&#39;s Death

题目链接:HDU-5129 题目大意为给一堆字符串,问由任意两个字符串的前缀子串(注意断句)能组成多少种不同的字符串. 思路是先用总方案数减去重复的方案数. 考虑对于一个字符串S,如图,假设S1,S2,S3,S4,S5,S6均为前缀. 换言之,对于这种字符串,我们计算了三次. 发现,重复的方案数,等于中间如图有颜色的方块的数量.所以我们要做的也就是计数像图中有颜色的小方块的数量. 我们可以通过遍历像S6一样的字符串的数量,来计算重复的方案数.S6满足以下条件: 存在一个前缀S4为S6的后缀,且S

字符串(AC自动机):HDU 5129 Yong Zheng&#39;s Death

Yong Zheng's Death Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 224    Accepted Submission(s): 37 Problem Description Some Chinese emperors ended up with a mysterious death. Many historia

hdu 1879 继续畅通工程 (并查集+最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879 继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14075    Accepted Submission(s): 6136 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公