地址:http://codeforces.com/contest/832/problem/C

题目:

C. Strange Radiation
time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

n people are standing on a coordinate axis in points with positive integer coordinates strictly less than 106. For each person we know in which direction (left or right) he is facing, and his maximum speed.

You can put a bomb in some point with non-negative integer coordinate, and blow it up. At this moment all people will start running with their maximum speed in the direction they are facing. Also, two strange rays will start propagating from the bomb with speed s: one to the right, and one to the left. Of course, the speed s is strictly greater than people's maximum speed.

The rays are strange because if at any moment the position and the direction of movement of some ray and some person coincide, then the speed of the person immediately increases by the speed of the ray.

You need to place the bomb is such a point that the minimum time moment in which there is a person that has run through point 0, and there is a person that has run through point 106, is as small as possible. In other words, find the minimum time moment t such that there is a point you can place the bomb to so that at time moment t some person has run through 0, and some person has run through point 106.

Input

The first line contains two integers n and s (2 ≤ n ≤ 105, 2 ≤ s ≤ 106) — the number of people and the rays' speed.

The next n lines contain the description of people. The i-th of these lines contains three integers xivi and ti (0 < xi < 106, 1 ≤ vi < s, 1 ≤ ti ≤ 2) — the coordinate of the i-th person on the line, his maximum speed and the direction he will run to (1 is to the left, i.e. in the direction of coordinate decrease, 2 is to the right, i.e. in the direction of coordinate increase), respectively.

It is guaranteed that the points 0 and 106 will be reached independently of the bomb's position.

Output

Print the minimum time needed for both points 0 and 106 to be reached.

Your answer is considered correct if its absolute or relative error doesn't exceed 10 - 6. Namely, if your answer is a, and the jury's answer is b, then your answer is accepted, if .

Examples
input
2 999
400000 1 2
500000 1 1
output
500000.000000000000000000000000000000
input
2 1000
400000 500 1
600000 500 2
output
400.000000000000000000000000000000
Note

In the first example, it is optimal to place the bomb at a point with a coordinate of 400000. Then at time 0, the speed of the first person becomes 1000 and he reaches the point 106 at the time 600. The bomb will not affect on the second person, and he will reach the 0 point at the time 500000.

In the second example, it is optimal to place the bomb at the point 500000. The rays will catch up with both people at the time 200. At this time moment, the first is at the point with a coordinate of 300000, and the second is at the point with a coordinate of 700000. Their speed will become 1500 and at the time 400 they will simultaneously run through points 0 and 106.

思路:

  一看到是求最小时间,就应该想到是否可以二分。这题显然可以。

  二分时间,然后check的时候判断在当前时间下是否存在可行的炸弹放置区间。

  这题有几个需要注意的地方:

    1.只要左右各有一个人到就行了。

    2.炸弹放置的位置是整数点,注意如何取整。

    3.写代码时注意细节。

 #include <bits/stdc++.h>

 using namespace std;

 #define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> PII;
const double eps=1e-;
const double pi=acos(-1.0);
const int K=1e6+;
const int mod=1e9+; struct node
{
int x,v,dir;
}pp[K];
int n,s;
bool check(double x)
{
LL ll=1e6,lr=,rl=1e6,rr=,fl=,fr=;
for(int i=;i<=n;i++)
if(pp[i].dir&)//left
{
if(pp[i].x-1.0*(pp[i].v+s)*x>=) continue;
fl=;
if(pp[i].x-1.0*pp[i].v*x<=0.0){ll=,lr=1e6;continue;}
double t2=(pp[i].x-1.0*pp[i].v*x)/s;
LL dx=(LL)(pp[i].x+floor((s-pp[i].v)*(x-t2)));
ll=min(ll,(LL)pp[i].x),lr=max(lr,dx);
}
else
{
if(pp[i].x+1.0*(pp[i].v+s)*x<=1e6) continue;
fr=;
if(pp[i].x+1.0*pp[i].v*x>=1e6){rl=,rr=1e6;continue;}
double t2=(1e6-pp[i].x-1.0*pp[i].v*x)/s;
LL dx=(LL)(pp[i].x-floor((s-pp[i].v)*(x-t2)));
rl=min(rl,dx),rr=max(rr,(LL)pp[i].x);
}
if(!(fl&&fr)) return ;
if(ll>lr || rl>rr) return ;
return !(ll>rr||lr<rl);
}
int main(void)
{
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++)
scanf("%d%d%d",&pp[i].x,&pp[i].v,&pp[i].dir);
double l=,r=1e6,mid,ans=-;
for(int i=;i<=;i++)
{
mid=(l+r)/2.0;
if(check(mid)) r=mid,ans=mid;
else l=mid;
}
printf("%.7f\n",ans);
return ;
}

Codeforces Round #425 (Div. 2) C - Strange Radiation的更多相关文章

  1. Codeforces Round #425 (Div. 2)C

    题目连接:http://codeforces.com/contest/832/problem/C C. Strange Radiation time limit per test 3 seconds ...

  2. Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论

    n people are standing on a coordinate axis in points with positive integer coordinates strictly less ...

  3. Codeforces Round #425 (Div. 2)

    A 题意:给你n根棍子,两个人每次拿m根你,你先拿,如果该谁拿的时候棍子数<m,这人就输,对手就赢,问你第一个拿的人能赢吗 代码: #include<stdio.h>#define ...

  4. Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组

    Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...

  5. Codeforces Round #425 (Div. 2) Problem B Petya and Exam (Codeforces 832B) - 暴力

    It's hard times now. Today Petya needs to score 100 points on Informatics exam. The tasks seem easy ...

  6. Codeforces Round #425 (Div. 2) Problem A Sasha and Sticks (Codeforces 832A)

    It's one more school day now. Sasha doesn't like classes and is always bored at them. So, each day h ...

  7. Codeforces Round #425 (Div. 2) B. Petya and Exam(字符串模拟 水)

    题目链接:http://codeforces.com/contest/832/problem/B B. Petya and Exam time limit per test 2 seconds mem ...

  8. Codeforces Round #425 (Div. 2))——A题&&B题&&D题

    A. Sasha and Sticks 题目链接:http://codeforces.com/contest/832/problem/A 题目意思:n个棍,双方每次取k个,取得多次数的人获胜,Sash ...

  9. Codeforces Round #425 (Div. 2) B - Petya and Exam

    地址:http://codeforces.com/contest/832/problem/B 题目: B. Petya and Exam time limit per test 2 seconds m ...

随机推荐

  1. [Openwrt]wifi桥接设置

    1/连接wifi,用扫描加入,新建一个ingerface  client模式 2/新建wifi ,network选lan和自身新建的interface.此interface设置为bridge模式,连接 ...

  2. 有用的Python代码片段

    我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间.大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案.下面所有的代 ...

  3. Python爬虫(七)

    源码: import requests import re from my_mysql import MysqlConnect # 获取详情页链接和电影名称 def get_urls(page): u ...

  4. Android API Guides---Bluetooth

    Bluetooth Android平台包含蓝牙网络协议栈,它同意设备以无线方式与其他蓝牙设备进行数据交换的支持.应用程序框架提供了訪问通过Android蓝牙API的蓝牙功能.这些API使应用程序无线方 ...

  5. 剑指 offer set 11 最小的K个数

    总结 1. 假如允许修改给定数组, 那么通过快排的子过程, 可以在 o(n) 时间复杂度内得出结果. 2. 对于海量数据和不允许修改的数据, 通过最小堆的方式更好, 通过维持一个大小为 K 的最小堆

  6. 微软发布新版 Skype Linux 客户端

    导读 前两天,微软说要给Linux 用户带来一个令人兴奋的新闻,今天,这个新闻来了.它刚刚为 Linux 发布了一个新的 Skype 客户端.此次发布,微软为 Linux 带来的 Skype 客户端与 ...

  7. SharedPreferences小技巧

    相信Android的这个最简单的存储方式大家都很熟悉了,但是有一个小小技巧,也许你没有用过,今天就跟大家分享一下,我们可以把SharedPreferences封装在一个工具类中,当我们需要写数据和读数 ...

  8. Win32控制台中使用定时器的方法

    在MFC中用OnTimer()函数就可以很方便的实现定时事件,但在Win32控制台工程中没有消息循环,MSDN里也不推荐把SetTimer()用在Console Applications里. 同理,在 ...

  9. js小功能实现

    发送随机数手机验证码60秒倒计时 mm.mobileCheck = function(t){ var mobile = $("#user_mobile").val(); if(&q ...

  10. c#基础 第三讲

    Random r = new Random();                 string x, y;             while (true)             {         ...