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;
}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5070007.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
Archery是一个开源的漏洞扫描和管理平台,可以帮助用户发现和管理应用程序和系统的漏洞。下面是部署和使用Archery的步骤: 1. 安装Python和pip Archery使用Python编写,因此需要先安装Python和pip。具体安装方法可以参考Python官方文档。 2. 下载和安装Archery 可以在Archery的GitHub页面下载最新版的代码,或者使用pip安装: ``` pip install archerysec ``` 3. 配置数据库 Archery使用MySQL或PostgreSQL作为后端数据库,可以根据需要选择其中一种。在安装和配置好数据库之后,需要修改Archery的配置文件config.yaml,将数据库连接信息填写到相应的字段中。 4. 运行Archery 在修改好配置文件之后,可以使用以下命令启动Archery: ``` archerysec manage runserver ``` 该命令将启动Archery的Web界面,并监听本地的8000端口。可以通过浏览器访问http://localhost:8000/来进入Archery的主界面。 5. 添加扫描目标 在进入Archery的主界面之后,可以点击“Add Target”按钮添加扫描目标。可以选择手动输入目标的IP地址或域名,也可以导入一个IP地址或域名列表。 6. 运行漏洞扫描 添加完扫描目标之后,可以在主界面上点击“Run Scan”按钮开始漏洞扫描。Archery支持多种漏洞扫描工具,可以根据需要选择使用哪些工具进行扫描。 7. 查看漏洞报告 漏洞扫描完成后,可以在主界面上查看扫描结果。Archery将漏洞分为几个不同的等级,可以根据等级对漏洞进行筛选和排序。还可以查看每个漏洞的详细信息和建议的修复方案。 以上就是使用Archery进行漏洞扫描和管理的基本步骤。需要注意的是,Archery只是一个工具,不能完全替代人工的漏洞分析和修复工作。在使用Archery的过程中,需要结合其他安全工具和人工审查来保证应用程序和系统的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值