zoukankan      html  css  js  c++  java
  • 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
    ", ok ? "YES" : "NO");
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    java 学习进度二
    java 学习进度一
    Lua 笔记17
    chrome浏览器扩展的事件处理
    指定的参数错误。Vim.Host.DiskPartitionInfo.-spec VSPHERE.LOCALAdministrator WIN-DOPGQVRRU2C
    MySQL分区表
    MySQL绿色版的安装(mysql-5.6.22-win32.zip)
    Oracle操作语言分类
    注册表法修改IE8安全级别的方法
    JDK版本不兼容问题之:一台机器安装多个版本的JDK
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/5070007.html
Copyright © 2011-2022 走看看