LA 4253 Archery 二分
题意:
x轴上方有若干条平行于x轴的线段
在x轴的区间\([0, \, W]\)内找一点发射一条射线,使其穿过所有线段。
问是否存在这样的点。
分析:
我们二分射线端点的坐标,将线段按纵坐标从小到大排序,维护一个可以穿过所有线段的极角区间。
如果该区间为空说明这个点不符合要求,我们可以根据扫描到的最后一条线段来调整出射点的位置。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const int maxn = 5000 + 10;
typedef long double LD;
const LD eps = 1e-10;
int dcmp(LD x) {
if(fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
}
struct Segment
{
LD y, l, r;
void read() { cin >> y >> l >> r; }
bool operator < (const Segment& a) const {
return y < a.y;
}
};
int n;
LD W;
Segment seg[maxn];
int check(LD x) {
LD L = atan2(seg[0].y, seg[0].r - x);
LD R = atan2(seg[0].y, seg[0].l - x);
for(int i = 1; i < n; i++) {
LD l = atan2(seg[i].y, seg[i].r - x);
LD r = atan2(seg[i].y, seg[i].l - x);
if(dcmp(l - R) > 0) return 1;
if(dcmp(r - L) < 0) return -1;
L = max(L, l);
R = min(R, r);
}
return 0;
}
int main()
{
//freopen("4253.txt", "r", stdin);
int T; scanf("%d", &T);
while(T--) {
cin >> W;
scanf("%d", &n);
for(int i = 0; i < n; i++) seg[i].read();
sort(seg, seg + n);
double L = 0, R = W;
bool ok = false;
for(int i = 0; i < 100; i++) {
LD mid = (L + R) / 2;
int t = check(mid);
if(t == 1) L = mid;
else if(t == -1) R = mid;
else {
ok = true;
break;
}
}
printf("%s\n", ok ? "YES" : "NO");
}
return 0;
}
LA 4253 Archery 二分的更多相关文章
- LA 4253 箭术(二分枚举)
https://vjudge.net/problem/UVALive-4253 题意: 有n个平行于x轴的线段,每条线段代表一个靶子.判断是否可以站在x轴上[0,W]区间内的某个位置射箭. 思路:二分 ...
- UVa LA 4254 - Processor 二分,贪心 难度: 1
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- Netty中CompositeByteBuf的理解以及读写操作
转载请注明出处 https://www.cnblogs.com/majianming/articles/the_composite_byte_buf_read_and_wite_operation_o ...
- LA 2678 Subsequence(二分查找)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea
题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...
- LA 4725 (二分) Airport
题意: 有W.E两个跑道,在每个时刻每个跑道的飞机都从0开始编号,而且每个时刻都有Wi和Ei架飞机到达这两个跑道.而且每个时刻只能选择一个跑道的一架飞机起飞.问如何选择才能使得飞机的最大编号最小.(每 ...
- LA 3971 (二分) Assemble
题意: 你有b块钱想要组装一台电脑.给出n个配件的种类,品质和价格,要求每个种类的配件各买一个总价格不超过b且“品质最差配件”的品质因子应尽量大. 这种情况下STL的map的确很好用,学习学习 这种最 ...
- Uva LA 3177 - Beijing Guards 贪心,特例分析,判断器+二分,记录区间内状态数目来染色 难度: 3
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- LA 3268 号码簿分组(最大流+二分)
https://vjudge.net/problem/UVALive-3268 题意: 有n个人和m个组.一个人可能属于很多组.现在请你从某些组中去掉几个人,使得每个人只属于一个组,并使得人数最多的组 ...
随机推荐
- UI2_异步下载
// AppDelegate.m // UI2_异步下载 // // Created by zhangxueming on 15/7/17. // Copyright (c) 2015年 zhangx ...
- fleet - 基于Machine Metadata的任务调度
基于Machine Metadata的任务调度 复杂和特定的要求的应用程序可以针对一个子集的集群调度通过machine metadata.强大的部署拓扑结构,可以实现的基础上的机器的地区,机架位置,磁 ...
- SpringBoot 数据库操作 增删改查
1.pom添加依赖 <!--数据库相关配置--> <dependency> <groupId>org.springframework.boot</groupI ...
- js 数组array es5-es6+ 新增方法函数
arr.forEach(function(item,index,arr){},this) 相当于普通的for循环,第一个回调参数,第二个this可以重定向[箭头函数则不生效] arr.map() 非 ...
- 帝国empirecms数据库数据表详细说明
表名 解释 phome_ecms_infoclass_news 新闻采集规则记录表 phome_ecms_infotmp_news 采集临时表 phome_ecms_news 新闻主数据记录表 p ...
- Android中当item数量超过一定大小RecyclerView高度固定
Android中当item数量超过一定大小时,将RecyclerView高度固定 方法1 直接通过LayoutParams来设定相应高度 ViewGroup.LayoutParams lp = rv. ...
- 使用SharePreferences存取数据(慕课笔记 )
0.视频地址:http://www.imooc.com/video/3265 1.使用SharePreferences存取数据: public class MainActivity extends A ...
- winform 配置文件增删改查
winform 配置文件是 App.config webform 的配置文件 是web.config 其实基本操作都一样 设置个配置文件 全局文件 访问者个配置文件 对这个配置文件增删 ...
- javaSe-反射3
package com.java.chap07.sec04; public class Student { private String name; private Integer age; publ ...
- POJ 2288 Islands and Bridges (状压DP,变形)
题意: 给一个无向图,n个点m条边,每个点有点权,要求找到一条哈密顿路径,使得该路径的f(path)值最大.输出f值,若有多条最大f值的路径,输出路径数量. f值由如下3点累加而来: (1)所有点权之 ...