BZOJ2596 [Wc2007]疯狂赛车

写了一上午谁叫你智商低呢2333

Orz ydc虽然WC考跪了没进15人队

计算几何题真烦【摔

  1 /**************************************************************
  2     Problem: 2596
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:2256 ms
  7     Memory:159952 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <cmath>
 12 #include <cstring>
 13 #include <algorithm>
 14 #include <vector>
 15 #include <queue>
 16
 17 using namespace std;
 18 typedef double lf;
 19 const lf eps = 1e-10;
 20 const int N = 3000005;
 21
 22 inline int read() {
 23     int x = 0, sgn = 1;
 24     char ch = getchar();
 25     while (ch < ‘0‘ || ‘9‘ < ch) {
 26         if (ch == ‘-‘) sgn = -1;
 27         ch = getchar();
 28     }
 29     while (‘0‘ <= ch && ch <= ‘9‘) {
 30         x = x * 10 + ch - ‘0‘;
 31         ch = getchar();
 32     }
 33     return sgn * x;
 34 }
 35
 36 inline lf sqr(lf x) {
 37     return x * x;
 38 }
 39
 40 inline int dcmp(lf x) {
 41     return fabs(x) <= eps ? 0 : (x > eps ? 1 : -1);
 42 }
 43
 44 struct point {
 45     lf x, y;
 46     point() {}
 47     point(lf _x, lf _y) : x(_x), y(_y) {}
 48
 49     inline point operator + (point p) {
 50         return point(x + p.x, y + p.y);
 51     }
 52     inline point operator - (point p) {
 53         return point(x - p.x, y - p.y);
 54     }
 55     inline lf operator * (point p) {
 56         return x * p.y - y * p.x;
 57     }
 58     inline lf operator % (point p) {
 59         return x * p.x + y * p.y;
 60     }
 61     inline point operator * (lf a) {
 62         return point(x * a, y * a);
 63     }
 64     inline point operator / (lf a) {
 65         return point(x / a, y / a);
 66     }
 67
 68     inline bool operator < (const point &p) const {
 69         return dcmp(x - p.x) == 0 ? dcmp(y - p.y) < 0 : dcmp(x - p.x) < 0;
 70     }
 71     inline bool operator != (const point &p) const {
 72         return dcmp(x - p.x) || dcmp(y - p.y);
 73     }
 74     inline bool operator == (const point &p) const {
 75         return !dcmp(x - p.x) && !dcmp(y - p.y);
 76     }
 77
 78     friend inline lf dis2(point p) {
 79         return sqr(p.x) + sqr(p.y);
 80     }
 81     friend inline lf dis(point p) {
 82         return sqrt(dis2(p));
 83     }
 84     friend inline lf dis(point p, point a, point b) {
 85         return fabs(((p - a) * (p - b)) / dis(b - a));
 86     }
 87     friend inline point projection(point p, point a, point b) {
 88         point c = b - a;
 89         lf t = -((a - p) % c) / (c % c);
 90         return a + c * t;
 91     }
 92     friend inline bool on_seg(point p, point a, point b) {
 93         return dcmp(p.x - a.x) * dcmp(p.x - b.x) <= 0 &&
 94             dcmp(p.y - a.y) * dcmp(p.y - b.y) <= 0;
 95     }
 96 } p[N];
 97
 98 struct edge {
 99     int next, to;
100     lf v;
101     edge() {}
102     edge(int _n, int _t, lf _v) : next(_n), to(_t), v(_v) {}
103 } e[N];
104
105 struct heap_node {
106     lf v;
107   int to;
108   heap_node() {}
109     heap_node(lf _v, int _t) : v(_v), to(_t) {}
110
111     inline bool operator < (const heap_node &a) const {
112         return v > a.v;
113     }
114 };
115
116 int n, cnt;
117 lf va, vb, Dis[N];
118 int first[N], tot;
119 priority_queue <heap_node> h;
120
121 inline void add_edge(int x, int y, lf z) {
122     e[++tot] = edge(first[x], y, z);
123     first[x] = tot;
124 }
125
126 inline void Add_Edges(int x, int y, lf z) {
127     add_edge(x, y, z);
128     add_edge(y, x, z);
129 }
130
131 vector <point> E;
132 int pos[N];
133
134 void build_graph() {
135     int i, j, id;
136     lf H, D;
137     point Pro, v, P, p1, p2;
138     for (i = 1; i <= n; ++i) {
139         E.clear();
140         p1 = p[i], p2 = p[i + 1];
141         for (j = 1; j <= n + 1; ++j)
142             if (p[j] != p1 && p[j] != p2) {
143                 H = dis(p[j], p1, p2), D = vb * H / sqrt(sqr(va) - sqr(vb));
144                 Pro = projection(p[j], p1, p2), v = (p2 - p1) / dis(p2 - p1);
145                 P = Pro + v * D;
146                 if (on_seg(P, p1, p2)) E.push_back(P);
147                 P = Pro - v * D;
148                 if (on_seg(P, p1, p2)) E.push_back(P);
149             }
150
151         E.push_back(p1), E.push_back(p2);
152         sort(E.begin(), E.end());
153         int Cnt = unique(E.begin(), E.end()) - E.begin();
154         if (E[0] == p1)
155             pos[0] = i, pos[Cnt - 1] = i + 1;
156         else
157             pos[0] = i + 1, pos[Cnt - 1] = i;
158         for (j = 1; j < Cnt - 1; ++j)
159             pos[j] = ++cnt;
160         for (j = 0; j < Cnt - 1; ++j)
161             Add_Edges(pos[j], pos[j + 1], dis(E[j] - E[j + 1]) / va);
162
163         for (j = 1; j <= n + 1; ++j)
164             if (p[j] != p1 && p[j] != p2) {
165                 H = dis(p[j], p1, p2), D = vb * H / sqrt(sqr(va) - sqr(vb));
166                 Pro = projection(p[j], p1, p2), v = (p2 - p1) / dis(p2 - p1);
167                 P = Pro + v * D;
168                 if (on_seg(P, p1, p2)) {
169                     id = lower_bound(E.begin(), E.end(), P) - E.begin();
170                     Add_Edges(pos[id], j, dis(P - p[j]) / vb);
171                 }
172                 P = Pro - v * D;
173                 if (on_seg(P, p1, p2)) {
174                     id = lower_bound(E.begin(), E.end(), P) - E.begin();
175                     Add_Edges(pos[id], j, dis(P - p[j]) / vb);
176                 }
177             }
178     }
179 }
180
181 #define y e[x].to
182 inline void add_to_heap(int p) {
183   int x;
184   for (x = first[p]; x; x = e[x].next)
185     if (!dcmp(Dis[y] + 1.0))
186       h.push(heap_node(e[x].v + Dis[p], y));
187 }
188 #undef y
189
190 void Dijkstra(int S) {
191     int p;
192     for (p = 1; p <= cnt; ++p)
193         Dis[p] = -1.0;
194     while (!h.empty()) h.pop();
195     Dis[S] = 0, add_to_heap(S);
196     while (!h.empty()) {
197         while (dcmp(Dis[h.top().to] + 1.0) && !h.empty()) h.pop();
198         if (h.empty()) break;
199         p = h.top().to;
200         Dis[p] = h.top().v;
201         if (p == n + 1) return;
202         h.pop();
203         add_to_heap(p);
204     }
205 }
206
207 int main() {
208     int i, j, x, y;
209     n = read();
210     scanf("%lf%lf", &va, &vb);
211     p[1] = point(0, 0);
212     for (i = 1; i <= n; ++i) {
213         x = read(), y = read();
214         p[i + 1] = point(x, y);
215     }
216     for (i = 1; i <= n + 1; ++i)
217         for (j = 1; j <= n + 1; ++j)
218             if (i != j)
219                 add_edge(i, j, dis(p[i] - p[j]) / vb);
220     cnt = n + 1;
221     build_graph();
222     Dijkstra(1);
223     printf("%lf\n", Dis[n + 1]);
224     return 0;
225 }

时间: 2024-10-08 14:07:07

BZOJ2596 [Wc2007]疯狂赛车的相关文章

北京赛车公式8码滚雪球技巧规律

有人说赌博害人不浅的,也有人靠赌博闷声发大财的,这些都是真实存在的.至于有的发财有的输光光,总结有以下几点 输的人盲目下注,全拼运气,这把输了下把就翻倍下注,如果连4把没开,基本上就是痛苦的一天了. 没耐心,心急,两三把不中,一脑子全压了,这种心态输光光,赢钱的人都是头脑清晰,每天赢一定的钱了,就打死不下了,收了就是收了,输了设定的金额,也马上收了,不要死磕. 想要赢钱,一定要有稳定的计划,看得懂走势图,如果你不懂,那你就要看别人的计划,看准了再跟,也别盲目的跟跟,也许人家计划很准,你一跟就不准

ICO如此疯狂为哪般?

编者语: 独角兽一词起源于硅谷,是投资行业,尤其是风险投资业的术语,指的是那些估值超过十亿美元的创业公司.独角兽凤毛麟角,占创业公司总数的0.1%都不到.鑫根资本认为,一个独角兽能达到如此估值,肯定是掌握了某种颠覆时代的技术或模式,使得投资者趋之若鹜,它的诞生势必将带动其相关的产业链发生根本.敬请阅读! 文/卢菁.玟君(鑫根资本) 七月初,美国两家名不见经传的区块链技术公司Tezos和block.one成功完成了总值4亿美元的融资,而且,整个过程同VC.投行.华尔街.或金融证券监管都毫无关联.他

51CTO学院教师节疯狂大让利活动

一颗心,承载着千万个理想.一句话,影响着千万个选择.寒来暑往,春夏秋冬,在这个最美的季节,有一个人,有一个节日属于他.9月10教师节即将来临,51CTO学院全体员工向各位讲师说声:                                                                                       "您辛苦了"~ 51CTO学院感谢两年来广大讲师对平台的鼎力支持,如今学院已成长为"中国最大的IT实战在线教育培训平台&quo

unity3d 赛车游戏——复位点检测

一直没有时间写博客 昨天我的CarWaypoints插件也告一段落了 今年没回家,过年就我一个人 挺无聊的,那就休息一天写几篇博客吧 我的代码可能很少,但是思路很重要 希望不懂的朋友别只copy代码 赛车游戏的话赛车难免会冲出跑道.掉入水坑.卡在障碍物上....等情况 那么问题来了,遇到这些情况怎么办呢? 玩家玩得好好的,难道就因为遇到这些情况要退出游戏重新进入吗? 那当然是不现实的,要是我的话果断卸载游戏 还要骂一句做游戏的人是脑残啊 我想你不希望玩家骂你是脑残吧,哈哈哈 新技能,赶快GET起

炉石传说 疯狂爆破者空场炸死2个精灵龙的概率

背景介绍 炉石传说中,有一张卡牌叫疯狂爆破者,功能为造成6点伤害,随机分配给其他角色(包括英雄和随从). 这经常能造成一些意想不到的效果,比如对方空场有2个精灵龙,如果能直接炸死,则能造成巨大的优势,所以本文将要分析一下空场炸死对方2个精灵龙的概率. 分析 1. 使用程序进行模拟 #include "stdio.h" #include <cmath> #include <stdlib.h> #include <algorithm> #include

采药 2005年NOIP全国联赛普及组&amp;疯狂的采药

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大."

赛车比赛(洛谷U4566)

题目背景 kkk在赛车~ 题目描述 现在有N辆赛车行驶在一条直线跑道(你可以认为跑道无限长)上.它们各自以某种速度匀速前进,如果有两辆车A车和B车,A车在B车的后面,且A车的速度大于B车的速度,那么经过一定的时间后,A车必定会超过B车,这称为一次超车.求超车总数.道路起点的位置为0,没有两辆车的初始位置相同. 输入输出格式 输入格式: 第一行,一个数n,车辆的总数. 第二行~第n+1行,为n辆车的信息,每行有两个正整数x,y.X为起始位置,y为速度.0<x,y<=1000000 输出格式: 超

《疯狂程序员》有感

进入大学以来,几乎没有完整的看完过一本书.但是这本书不仅从头到尾的看完了,而且前后读了两遍.这本书就是<疯狂的程序员> 这正是<疯狂的程序员>的诞生之地--CSDN.所以也想借这个平台谈谈对该书的感受顺便分享一些『绝影』的经典语录. 读这本书的时候,总是给人一种身临其境的感觉,似乎自己就是那个「 疯狂的程序员」本人,这正是我能够坚持读下去的原因.也正是读了这本书,才真正的了解自己,了解程序员这个职业.并且决定矢志不渝的坚持做程序员,程序员是伟大的,他们把枯燥无味的代码变成丰富多彩的

1616 疯狂的采药(完全背包问题)

难度:普及- 题目类型:动规 提交次数:1 涉及知识:背包动规 题目背景 此题为NOIP2005普及组第三题的疯狂版. 此题为纪念LiYuxiang而生. 题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同种类的草药,采每一种都需要一些时间,每一种也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如