HDU 6136 Death Podracing (堆)

Posted suncongbo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 long
using namespace std;

const int N = 1e5;
struct Fraction

    llong x,y;
    Fraction() 
    Fraction(llong _x,llong _y) x = _x,y = _y;
    void output() printf("%lld/%lld ",x,y);
    bool operator <(const Fraction &arg) const
    
        return x*arg.y<y*arg.x;
    
;
struct Element

    llong a,b; int id;
    bool operator <(const Element &arg) const
    
        return b<arg.b;
    
 a[N+3];
struct Node

    int id1,id2; Fraction x;
    Node() 
    Node(int _id1,int _id2,Fraction _x) id1 = _id1,id2 = _id2,x = _x;
    bool operator <(const Node &arg) const
    
        return arg.x<x;
    
;
priority_queue<Node> que;
bool vis[N+3];
int nxt[N+3],prv[N+3];
int n; llong m;

llong gcd(llong x,llong y) return y==0 ? x : gcd(y,x%y);

Fraction calc(Element x,Element y)

    if(x.a<y.a) swap(x,y);
    if(x.b>y.b) y.b += m;
    return Fraction(y.b-x.b,x.a-y.a);


int main()

    int T; scanf("%d",&T);
    while(T--)
    
        scanf("%d%lld",&n,&m);
        for(int i=1; i<=n; i++) scanf("%lld",&a[i].b);
        for(int i=1; i<=n; i++) scanf("%lld",&a[i].a),a[i].id = i;
        sort(a+1,a+n+1);
        for(int i=1; i<=n; i++) prv[i] = i==1?n:i-1,nxt[i] = i==n?1:i+1;
        for(int i=1; i<=n; i++) que.push(Node(i,nxt[i],calc(a[i],a[nxt[i]])));
        Fraction ans;
        while(!que.empty())
        
            Node cur = que.top(); que.pop();
            int u = cur.id1,v = cur.id2;
            if(vis[u]||vis[v]) continue;
            ans = cur.x;
            if(a[u].id>a[nxt[u]].id) swap(u,v);
            vis[u] = true;
            if(prv[u]!=nxt[u])
            
                que.push(Node(prv[u],nxt[u],calc(a[prv[u]],a[nxt[u]])));
            
            nxt[prv[u]] = nxt[u];
            prv[nxt[u]] = prv[u];
        
        llong g = gcd(ans.x,ans.y);
        printf("%lld/%lld\n",ans.x/g,ans.y/g);
        for(int i=1; i<=n; i++) vis[i] = nxt[i] = prv[i] = 0;
    
    return 0;

以上是关于HDU 6136 Death Podracing (堆)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6136 Death Podracing(循环链表)

HDU 5860 Death Sequence (递推)

HDU 5129 Yong Zheng's Death

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

算法leetcode|6136. 算术三元组的数目(rust和go全部双百)

算法leetcode|6136. 算术三元组的数目(rust和go全部双百)