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(循环链表)
[题目链接] 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 ...
- HDU 2176 取(m堆)石子游戏 (尼姆博奕)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ...
- hdu 2177 取(2堆)石子游戏(威佐夫博奕)
题目链接:hdu 2177 这题不是普通的 Nim 博弈,我想它应该是另一种博弈吧,于是便推 sg 函数打了个 20*20 的表来看,为了方便看一些,我用颜色作了标记,打表代码如下: #include ...
- HDU 1058 优先队列or堆
本来应当是一道优先队列或者堆的题 因为每个数都应该是已经得到的数*2 *3 *5 *7而得到的 但是 2*7 大于 3*2 这就必须保证每次取得都是没有拿过的最小的数 但是它主动降低难度在样例里卖了个 ...
- HDU 2176 取(m堆)石子游戏(Nim)
取(m堆)石子游戏 题意: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,1 ...
- HDU 2176 取(m堆)石子游戏 尼姆博弈
题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
随机推荐
- Spring 自定义注解,结合AOP,配置简单日志注解 (转)
java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...
- golang(4):函数 & 数组 & 切片 & map & 锁
内置函数 // 1. close:主要用来关闭channel // 2. len:用来求长度,比如string.array.slice.map.channel // 3. new:用来分配内存,主要用 ...
- 客户端相关知识学习(二)之h5与原生app交互的原理
前言 现在移动端 web 应用,很多时候都需要与原生 app 进行交互.沟通(运行在 webview中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能.所以,这次 ...
- 移动端 app
上传到蒲公英
- Java高并发程序设计学习笔记(二):多线程基础
转自:https://blog.csdn.net/dataiyangu/article/details/86226835# 什么是线程?线程的基本操作线程的基本操作新建线程调用run的一种方式调用ru ...
- scrapy-redis 实现分布式爬虫
分布式爬虫 一 介绍 原来scrapy的Scheduler维护的是本机的任务队列(存放Request对象及其回调函数等信息)+本机的去重队列(存放访问过的url地址) 所以实现分布式爬取的关键就是,找 ...
- Delphi CheckBox组件
- Jdk1.8的安装(Linux和windows)
1.1 JDK1.8下载地址 JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...
- Python名称空间与作用域
什么是名称空间? 比如下图的长方形代表内存,在这个内存里我要设置一个变量100,那么这个变量得有个门牌号,就叫他a吧,但其实变量不是这么存储的,他其实的存储方式是这样的,他会有一个名称空间,这个名称空 ...
- Linux 指令总结
1. 显示本机信息 显示ip地址 hostname -i 显示当前使用用户 whoani 显示cpu信息 lscpu