Death Podracing HDU - 6136 (循环链表)

参考http://www.cnblogs.com/forever97/p/hdu6136.html
题目大意】

  一堆人在操场上跑步,他们都有一定的速度和初始位置,
  当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时候游戏结束,
  问时长为多少

代码没有敲对,留个坑


#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define MP make_pair
#define ULL unsigned long long
#define LL   long long
#define inf 0x3f3f3f3f
#define md ((ll+rr)>>1)
#define ls (i<<1)
#define rs (ls|1)
#define eps 1e-5
#define N 100010
#define ree freopen("in.txt","r",stdin);
#define bug pf("----------------");
//2017年09月01日20:18:58
struct People{int pw,v,d;}p[N];
bool cmp(People a,People b){ return a.d<b.d; }
struct Frac{
    int num,den;
    Frac(){}
    Frac(int _num,int _den){ den=_den;num=_num; }
    bool friend operator <(Frac a,Frac b){ return 1LL*a.num*b.den<a.den*b.num; }
};
struct Node{
    int a,b; Frac t;
    Node(){}
    Node(int _a,int _b,Frac _t){
        a=_a;b=_b;t=_t;
    }
    bool friend  operator<(Node a,Node b){ return a.t<b.t; }
};
int n,L;
int nxt[N],pre[N],del[N];
priority_queue<Node>q;
Frac Cal(People a,People 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);
}
void out(int id){
    del[id]=1;
    nxt[pre[id]]=nxt[id];
    pre[nxt[id]]=pre[id];
    q.push(Node(pre[id],nxt[id],Cal(p[pre[id]],p[nxt[id]])));
}
int main(){
    ree
    int T;
    sf("%d",&T);
    while(T--){
        sf("%d%d",&n,&L);
        mem(del,0);
        for(int i=0;i<n;++i)sf("%d",&p[i].d),p[i].pw=i;
        for(int i=0;i<n;++i)sf("%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(Node(i,nxt[i],Cal(p[i],p[nxt[i]])));
        }
        int cnt=n;Frac ans;
        while(!q.empty()){
            Node u=q.top();q.pop();
            if(del[u.a]||del[u.b])continue;
            if(--cnt==1){ans=u.t;break;}
            if(p[u.a].pw>p[u.b].pw)out(u.b);
            else out(u.a);
        }
        pf("%d/%d\n",ans.num,ans.den);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值