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 point106.

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 0point 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.


  题目大意 数轴上有n个(每个人的位置大于0且小于106),每个人有一个朝向和一个最大速度。有一个神奇的炸弹,可以在一个非负整数点引爆(并不知道引爆的位置),并向两边射出速度s个单位每秒的光线(其速度严格大于人的速度),如果这个光线碰到人,且和人的朝向一样,那么人的最大速度会加上这个速度,引爆后所有人开始向他面向的方向全速奔跑(不考虑体力)。问最少需要多长时间使得点0和1e6被人到达了(不一定是同一个人)。

  显然是二分答案。现在来思考判定。

  当前二分的答案为mid,现在判断是否有人能够达到点0和1e6。

  如果没有,就考虑一下用炸弹爆炸后的光线来加速。显然可以放炸弹的地方是一个区间(假设我们会算它,然后继续)。

  然后判定的问题转化成判断两组区间,是否存在一对(在不同组内)的交集包含整点,这个就可以通过排序加二分查找解决,做法类似于codeforces 822C

  现在来思考如何计算这个区间(假定读者小学奥数学得还不错)

  假定人在点B处,它的终点为C,在点A处放置炸弹,AB = s1, BC = dist,光线在点D处追上人,耗时t0,人的速度为v0,光线的速度为vs。所以有:

  有了最大的追及时间就可以得到追及路程s1 = t0vs。

  然后就可以交代码去codeforces了。

  然而昨天晚上打比赛的时候,为了图快,没仔细读题,把题目大意读成所有人都离开(0, 1e6)的最少耗时,然而谜之Wrong Answer on pretest 3。还耗掉我一个小时,早知道该去切D题。

Code

 /**
* Codeforces
* Problem#832C
* Accepted
* Time:155ms
* Memory:7400k
*/
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <vector>
#include <stack>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean;
const signed int inf = (signed)((1u << ) - );
const signed long long llf = (signed long long)((1ull << ) - );
const double eps = 1e-;
const int binary_limit = ;
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
#define max3(a, b, c) max(a, max(b, c))
#define min3(a, b, c) min(a, min(b, c))
template<typename T>
inline boolean readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-' && x != -);
if(x == -) {
ungetc(x, stdin);
return false;
}
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
return true;
} int opt = ;
typedef class Segment {
public:
double l;
double r; Segment(double l = 0.0, double r = 0.0):l(l), r(r) { } Segment getBing(Segment b) {
return Segment(max(l, b.l), min(r, b.r));
} boolean hasint() {
return (int)l != (int)r;
} boolean isResonable() {
return l <= r;
} boolean operator < (Segment b) const {
if(opt == ) {
if(l != b.l) return l < b.l;
return r < b.r;
}
if(r != b.r) return r < b.r;
return l < b.l;
} }Segment; boolean operator < (int x, Segment a) {
if(opt == ) {
return x < a.l;
}
return x < a.r;
} int n, s;
int pos[], spe[], ds[]; inline void init() {
readInteger(n);
readInteger(s);
for(int i = ; i <= n; i++) {
readInteger(pos[i]);
readInteger(spe[i]);
readInteger(ds[i]);
}
} inline double calcS(double vs, double v0, double mid, double dist) {
double t0 = (mid * (v0 + vs) - dist) / vs;
return t0 * (vs - v0);
} /*
inline int ceil(double a) {
if(a == (int)a) return a;
return (int)a + 1;
}
*/ inline boolean check(double mid) {
double dist, t;
boolean f1 = false, f2 = false;
vector<Segment> v1, v2, v3;
for(int i = ; i <= n && (!f1 || !f2); i++) {
if(ds[i] == && !f1) {
dist = pos[i];
t = dist / spe[i];
if(t > mid) {
double s1 = calcS(s, spe[i], mid, dist);
if(s1 < ) continue;
v1.push_back(Segment(pos[i], pos[i] + s1));
v2.push_back(Segment(pos[i], pos[i] + s1));
} else f1 = true;
} else if(ds[i] == && !f2) {
dist = 1e6 - pos[i];
t = dist / spe[i];
if(t > mid) {
double s1 = calcS(s, spe[i], mid, dist);
if(s1 < ) continue;
v3.push_back(Segment(pos[i] - s1, pos[i]));
} else f2 = true;
}
}
if(f1 && f2) return true;
if(f1 && !v3.empty()) return true;
if(f2 && !v1.empty()) return true;
opt = ;
sort(v1.begin(), v1.end());
opt = ;
sort(v2.begin(), v2.end());
int sv1 = (signed)v1.size();
for(int i = , s; i < v3.size(); i++) {
Segment b = v3[i];
opt = ;
s = sv1 - (upper_bound(v1.begin(), v1.end(), (int)v3[i].r) - v1.begin());
opt = ;
s += upper_bound(v2.begin(), v2.end(), (int)ceil(v3[i].l)) - v2.begin();
if(s < sv1)
return true;
}
return false;
} inline void solve() {
int cnt = ;
double l = 0.0, r = 1e6;
while(l + eps < r && cnt <= binary_limit) {
double mid = (l + r) / ;
cnt++;
if(check(mid)) r = mid;
else l = mid;
}
printf("%.9lf", r);
} int main() {
init();
solve();
return ;
}

Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索

    Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...

  5. Codeforces Round #427 (Div. 2) Problem C Star sky (Codeforces 835C) - 前缀和

    The Cartesian coordinate system is set in the sky. There you can see n stars, the i-th has coordinat ...

  6. Codeforces Round #427 (Div. 2) Problem A Key races (Codeforces 835 A)

    Two boys decided to compete in text typing on the site "Key races". During the competition ...

  7. Codeforces Round #716 (Div. 2), problem: (B) AND 0, Sum Big位运算思维

    & -- 位运算之一,有0则0 原题链接 Problem - 1514B - Codeforces 题目 Example input 2 2 2 100000 20 output 4 2267 ...

  8. Codeforces Round #425 (Div. 2) C - Strange Radiation

    地址:http://codeforces.com/contest/832/problem/C 题目: C. Strange Radiation time limit per test 3 second ...

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

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

随机推荐

  1. string.Format格式化输出

    staticstring Format (string format,object arg0):将指定字符串中的一个或多个格式项替换为指定对象的字符串表示形式 (1)格式化货币(跟系统的环境有关,中文 ...

  2. node.js初识09

    1.node_module文件夹 如果你的require中没有写./,那么Node.js将该文件视为node_modules目录下的一个文件. 2.package.json文件 如果使用文件夹来统筹管 ...

  3. node.js初识08

    1.模块的概念,在前端的世界里,jq和js的关系,在后台里就是express和原生node的关系, 2.每一个js里的函数都只在当前文件里起作用,如果你希望在其他js里调用这个函数,这么你需要在这个j ...

  4. G 面经 && Leetcode: Longest Repeating Character Replacement

    Given a string that consists of only uppercase English letters, you can replace any letter in the st ...

  5. RSA 加解密 秘钥对说明

    rsa非对称加密, 加解密需要不同的秘钥,称作一对. rsa加解密分两种,第一:公钥加密私钥解密.第二:私钥加密公钥解密. 需要注意的是,公加私解得到的密文是变化的,而私加公解的得到的密文是固定的. ...

  6. DX9 顶点缓存案例

    // @time 2012.3.5 // @author jadeshu //包含头文件 #include <Windows.h> #include <d3d9.h> #pra ...

  7. Java多线程-----线程安全及解决机制

    1.什么是线程安全问题? 从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题: 如果在整个访问过程中,无一对象被其他线程修改,就是线程安 ...

  8. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  9. 了解一下UTF-16

    1)先啰嗦一下 UTF-16是一种编码格式.啥是编码格式?就是怎么存储,也就是存储的方式. 存储啥?存二进制数字.为啥要存二进制数字? 因为Unicode字符集里面把二进制数字和字符一一对应了,存二进 ...

  10. 20165305 苏振龙《Java程序设计》第三周学习总结

    面向对象和面向过程: 面向对象是相对面向过程而言的,面向过程强调的是功能行为,面向对象是将过程封装进对象,强调具备了功能的对象,面向对象是基于面向过程的. 面向对象的三个特征: 封装,继承,多态: 对 ...