题目链接

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 (堆)相关推荐

  1. HDU - 2176 取(m堆)石子游戏(尼姆博奕)

    题目链接:点击查看 题目大意:给出m堆石子,规则是尼姆博弈的规则,问先手必胜还是必败,若能必胜则第一次有多少种方式取石子 题目分析:这个题目是因为一开始知道尼姆博弈的结论,需要异或所有石子来判断的,然 ...

  2. A - Age of Moyu HDU - 6386(Dijkstra+堆优化)

    要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...

  3. HDU 6135 Casual Podracing(CDQ分治)

    Description 一个周长为 L L的圆弧上面有nn个不重合的点,第 i i个点距圆弧起点距离(圆上距离)为did_i,速度为 vi v_i(取逆时针为正方向,任意两点速度不同),能量为 wi ...

  4. ACM 博弈专题(5种模板)

    最近算法课在学博弈论的知识,顺手把算法题中的涉及到博弈论一并总结了 这篇文章的有些内容是参考了大佬的 可能有遗漏.... (一)巴什博弈(BAsh Game) 题目模板 只有一堆n个物品 两个人轮流取 ...

  5. 2012网赛杭州赛区

    1002 arrest 有k个警察在0点按顺序遍历1到n去抓小偷, 这样构图时就要对编号小的连向编号大的, 之前要floyd处理. 我赛后的构图:对每个点的遍历有个限制是必须是1次, 由于是费用流, ...

  6. 【HDU1848】Fibonacci again and again(博弈论)

    题面 Hdu 你有三堆石子,每堆石子的个数是 n,m,p n , m , p n,m,p,你每次可以从一堆石子中取走斐波那契数列中一个元素等数量的石子数,两人轮流取,不能操作者输,判定先后手的胜利. ...

  7. 随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)

    HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么 ...

  8. hdu 5575 Discover Water Tank(可合并堆)

    题目链接:hdu 5575 Discover Water Tank 题意: 有一个大水箱,里面有N-1个隔板,将这个大水箱分成了N个小水箱,每个隔板有一定的高度. 现在有m条信息,每条信息表示第x个水 ...

  9. [HDU] 5444.Elven Postman (堆)

    题意:对于一个堆,找出从根节点出发到某一个点的行走的路径 输入:第一行数据组数T,每一组第1行元素个数n,第2行各个元素,第3行询问个数,第4行询问元素. 输出:每一询问元素打印出由"E&q ...

最新文章

  1. UVA 11020 - Efficient Solutions(set)
  2. 业务直通式管理,你真的了解吗?
  3. 中国医疗AI第一股首位投资人:AI不再高深,正在回归商业本质
  4. C#中获取多个对象list中对象共有的属性项
  5. Linux常用命令(1)
  6. jsp因为端口无效不能启动_Java:JSP和Servlet面试题总结
  7. cmd进入到python安装目录下_在python中安装basemap
  8. 使用java库中的对称加密算法
  9. DM数据库密码策略和登录限制设置
  10. Linux 安装 Hive教程
  11. html点击按钮展开文字,JS 展开/收起按钮显示隐藏文字示例
  12. Git 图标无法正常显示解决方案
  13. .mpp文件在线打开网址
  14. Python全栈最全学习之路-Python基础(十一)
  15. 程序员用学位证吗_如何成为没有学位或新兵训练的开发人员
  16. 应届生如何写求职邮件?
  17. android马达测试,技术科普丨马达测试知多少?
  18. Bootstrap 中的 aria-label 和 aria-labelledby
  19. 申请MallBook分账需要准备哪些材料呢?
  20. oracle如何导出表结构及数据,PLSQL怎样导出oracle表结构和数据

热门文章

  1. Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归
  2. c++求矩阵的秩_线性代数复习(被玩坏的矩阵)
  3. Unet项目解析(5): 数据封装、数据加载、数据显示
  4. javascript一句话技巧
  5. ajax 乱码问题 以及Response.charset=GB2312
  6. go语言中map的使用
  7. 管道、通道、管程的区别
  8. XCTF-Reverse:simple-unpack
  9. 用SI 和 DI实现字符串的复制
  10. jquerymobile从index.html跳转到另外一个xxxx.html文件,js不执行的解决