LA 4253 Archery (二分)

Korea‘s reputation in archery is well known because the Korean archery teams have been sweeping almost all gold, silver, and bronze medals in the Olympic Games.

An archery game ICPC supported by NEXON (one of Korea‘s leading publishers of online contents) will be held in Korea. As a ceremonial event of the game, a famous master of archery will shoot an arrow to hit through all target boards made of paper. Because an
arrow flies along a straight line, it depends on his position of the archer line whether or not he hits all targets.

The figure below shows an example of the complete view of a game field from the sky. Every target is represented by a line segment parallel to the archer line. Imagine the coordinate system of which the origin is the leftmost point of the archer line and the
archer line is located on the positive x -axis.

In the above figure, the master can hit all targets in position B. However, he never hits all targets in position A because any ray from A intersects at most 3 targets.

Given the width of the archer line and the target locations, write a program for determining if there exists a position at which the master can hit all targets. You may assume that the y -coordinates of all targets are different.
Note that if an arrow passes through an end point of a target, it is considered to hit that target.

Input

Your program is to read from standard input. The input consists of T test cases. The number of test cases T(1T30) is
given in the first line of the input. Each test case starts with a line containing an integerW (2W10,
000, 000) , the width of an archer line. The next line contains an integer N (2N5,
000) , the number of target boards. The i -th line of the following N lines contains three integers Di , Li , Ri (1DiW,
0Li < RiW) ,
where 1iN , Di represents
the y -coordinate of the i -th target, and Li andRi represent the x -coordinates
of the leftmost point and the rightmost point of the target, respectively. Note that Di  Dj if i  j .

Output

Your program is to write to standard output. Print exactly one line for each test case. Print ``YES" if there exists a position on the archer line at which a master of archery can hit all targets, otherwise, ``NO".

The following shows sample input and output for three test cases.

Sample
Input

3
15
4
10 2 7
7 5 12
2 7 12
4 9 13
6
3
2 1 3
4 0 2
5 4 6
10
4
8 2 5
4 2 5
6 5 8
2 5 8

Sample
Output

YES
NO 

YES

题目大意:给你一堆靶子,每个靶子是一段区间并有自己的高度,问你能不能在给定区间内找一条直线把这些靶子全部串起来。

分析:看了网上的题解才知道做法,二分射箭的位置,然后维护一段仰角的区间,如果一个靶子在当前区间左边则向左移动,在右边则向右移动。
#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define max(a,b) a > b ? a:b
#define min(a,b) a > b ? b:a
#define eps 1e-9
#define pi 4*atan(1.0)
using namespace std;
int n,w,T;
struct thing
{
	int d,l,r;
} tar[5001];
bool cmp(thing a,thing b)
{
	return a.d < b.d;
}
int check(long double x)
{
	long double L = 0,R = pi;
	for(int i = 1;i <= n;i++)
	{
		long double l = atan2(tar[i].d,tar[i].r - x);
		long double r = atan2(tar[i].d,tar[i].l - x);
		if(fabs(r - L) > eps && r < L) return -1;
		if(fabs(R - l) > eps && l > R) return 1;
		L = max(L,l);
		R = min(R,r);
	}
	return 0;
}
using namespace std;
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&w);
		scanf("%d",&n);
		for(int i = 1;i <= n;i++) scanf("%d %d %d",&tar[i].d,&tar[i].l,&tar[i].r);
		sort(tar+1,tar+1+n,cmp);
		bool flag = false;
		long double l = 0,r = w;
		while(fabs(l - r) > eps)
		{
			long double mid = (l+r)/2;
			int num = check(mid);
			if(num == 1) l = mid;
			else
			 if(num == -1) r = mid;
			 else
			 {
		       	flag = true;
		       	break;
			 }
		}
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
} 

时间: 2024-11-06 23:46:55

LA 4253 Archery (二分)的相关文章

2015 暑假

2015.07.19 1 //2015.07.19 2 3 **********做的题目*********** 4 LA 4254 5 二分最小化最大值,check函数不好写---,是一秒一秒地来处理的 6 7 UVa 11627 8 二分,写check函数的时候,用到了一点点物理的平抛,求出下落的区间的范围,再判断是否可行 9 10 UVa 11134 11 贪心,优先队列, 12 行列无关,转化为对于[1,n]中的每一个数,判断i是否在区间[l,r]里面 13 然后贪心地选择包含i点的右端点

LA 3353 Optimal Bus Route Design 二分匹配和有向图中的环

题意:题目给出一个有向图 , 找若干个圈,使得每个结点切好属于一个圈,并且所有圈的总长度最小 , 如果没有满足条件的就输出 'N' . 注意:1.有重边 2.如果有向边(u , v) , (v , u)都存在 , 它们的长度不一定相同. 解法: 刚看这个题目的时候,没有什么思路,知道是用二分匹配之后就更没思路了.这题的关键还是在于构图: 每个点分成入度点和出度点两个点,然后在从新建图,例如:u 分成 u1 , u2 , v 分成 v1 , v2 , 假如有 (u , v) 这条边 , 那么就变成

LA 3126 二分匹配---DAG中的最小路径应用

题意:有 n 个顾客 , 需要坐出租车从一个地方去另一个地方 , 每个顾客的出发时间.出发地点.目的地点都已给出 , 从出发地点到目的地点的时间为两地之间的路径长度 , 并且出租车要比顾客的出发时间早一分钟到达 , 问最少需要派出多少辆出租车. 解法:我们先这样来构图 , 每个顾客是一个结点,如果同一个出租车在接完客人 u 之后还来得及节客人 v , 那么就在 u 到 v 之间连一条有向边 . 由此可以发现 , 这个图是一个DAG , 那么我们就只需要找最小路径覆盖(最小路径覆盖:是指在图中找尽

LA 3971 组装电脑(二分)

https://vjudge.net/problem/UVALive-3971 题意:你有b块钱,想要组装一台电脑.给出n个配件各自的种类.品质因子和价格,要求每种类型的配件各买一个,总价格不超过b,且“品质最差配件”的品质因子应尽量大. 思路: 最小值最大,很明显要二分. 那么怎么判断这个品质因子下钱是够用的呢? 对于每个类型的配件来说,买最便宜的复合品质因子的配件,如果这样都大于b,那就得减小品质因子了. 1 #include<iostream> 2 #include<algorit

LA 4254 Processor 处理器 【二分 贪心 优先队列】

题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21663 二分: 最大值最小的问题通过二分来求解.对处理器速度进行二分之后,问题就转化成了对于给定的处理速度,问处理器是否可以将这些问题处理完. 贪心: 一个贪心的思路就是每个时刻应该尽量 做可以做的任务中,结束时间最早的那个,这样最起码不会使结果更糟.这样就可以枚举每个单位时间,然后去找可以做的并且结束时间最早的那个去做,直到用完这一单位时间或者无任务可做为止.

LA 3635 - Pie 【二分】

Regionals 2006 >> Europe - Northwestern 3635 - Pie Time limit: 3.000 seconds My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are com

LA 3971 (二分) Assemble

题意: 你有b块钱想要组装一台电脑.给出n个配件的种类,品质和价格,要求每个种类的配件各买一个总价格不超过b且“品质最差配件”的品质因子应尽量大. 这种情况下STL的map的确很好用,学习学习 这种最大值最小的问题可以用二分法,自己写的二分会死循环,学习一下别人的二分. 1 //#define LOCAL 2 #include <vector> 3 #include <cstdio> 4 #include <string> 5 #include <map>

LA 4725 (二分) Airport

题意: 有W.E两个跑道,在每个时刻每个跑道的飞机都从0开始编号,而且每个时刻都有Wi和Ei架飞机到达这两个跑道.而且每个时刻只能选择一个跑道的一架飞机起飞.问如何选择才能使得飞机的最大编号最小.(每个时刻算编号时是在飞机起飞之前的) 思路: 又是一个最大值最小的问题,可以用二分,不过怎么二分我没有想到. 参考的别人的代码:http://blog.csdn.net/u011345136/article/details/17793415 起飞的决策是这样的: 如果一条跑道是空的,另一条跑道有飞机,

LA 3268 号码簿分组(最大流+二分)

https://vjudge.net/problem/UVALive-3268 题意: 有n个人和m个组.一个人可能属于很多组.现在请你从某些组中去掉几个人,使得每个人只属于一个组,并使得人数最多的组中人员数目为最小值. 思路:建立超级源汇点,源点和每个人相连,容量为1,说明每个人最多只能在一个组中.每个人和可以属于的组相连,容量为1.接下来枚举组的最大容量值,将每组和汇点相连,容量为枚举值,二分跑最大流即可. 1 #include<iostream> 2 #include<algori