题目

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4167

题意

有n+1条平行于x轴的线段,最底下的线段是[0, w],站在最下面的第0条线段上的某个点上,问有没有一条过该点的直线也通过上面的n条线段。2<=n<=5000,2<=w<=1e7,保证这n+1条线段高度都不同。最高的线段到第0条线段高度差(y坐标差)不超过n,数据保证每条线段高度不同。对于第i条线段,其左右端点横坐标Li,Ri必然满足0<=Li<Ri<=W。第i条线段高度Di满足0<=Di<=W。Li,Ri,Di都是整数,这样精度问题较小。

思路

想到直线就会想到两点式或者点斜式。这里两点式一定会TLE。因此只能是点斜式了,枚举斜率并不是一个很好的做法。因此,可以枚举直线上一点,然后通过斜率来看有没有符合结果的直线。由于直线可以平移,因此总可以平移到一种同时经过第i条线段左端点和第k条线段右端点的情况。因此只需要枚举这n+1条线段的左端点。

对于第i条线段的左端点(Li,Di),如果有一条经过(Li,Di)的直线经过全部n+1条线段,则可以输出"YES",否则,还要继续枚举下一线段的左端点。或者可以说,如对(Li,Di),存在斜率k(k可能为无穷)使得对应直线经过全部n+1条线段,则满足题意

由于线段是平行于x轴的,所以不会产生跨x轴的情况,那么就可以维护每条肽段所对应的可行斜率的集合,如果这些集合的并集非空,那么就有符合结果的直线存在。

但是直接维护斜率存在要过90度的情况,因此,可以以(Li,Di)为中心建立极坐标系,维护线段所对应角度。如果比Di高,对应区间为(Ri, Di)对应极角到(Li, Di)对应极角这个封闭区间。如果比Di低,也就是在x轴下方,总可以不失意义转换为x轴上方的对应方向相反的区间。

感想:

1. 注意如果把scanf("%d%d", R, &n) == 2作为判断条件,就会wa,这一般是因为测试数据中有冗余

2. 一开始枚举了两条线段的端点<左,左>,<左,右>,<右,左>,<右,右>四种情况,所以一直TLE。但是因为必然可以平移到既有左端点又有右端点,所以直接枚举遍历左或者右端点就够了

3. 精度倒不用特别注意

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <set>
using namespace std;
typedef pair<int, int> Pair;
typedef long long ll;
const int MAXN = 5e3 + 4;
const double pie = acos(-1.0);
int n;
int D[MAXN];
int L[MAXN];
int R[MAXN];
bool simplecheck() {int mnX = 0;int mxX = R[0];for (int i = 0; i <= n; i++) {mnX = max(mnX, L[i]);mxX = min(mxX, R[i]);}return mnX <= mxX;}double getK(int x0, int x1, int y0, int y1) {return (y1 - y0) * 1.0 / (x1 - x0);
}double getAng(int x0, int x1, int y0, int y1) {if (x0 == x1)return pie / 2;double ang = atan(getK(x0, x1, y0, y1));if (ang < 0)return ang + pie;return ang;
}void getAngInterval(int x0, int y0, int i, double& a0, double& a1) {if (D[i] == y0) {a0 = 0;a1 = pie;}else if (D[i] > y0) {a0 = getAng(x0, R[i], y0, D[i]);a1 = getAng(x0, L[i], y0, D[i]);}else {a0 = getAng(x0, L[i], y0, D[i]);a1 = getAng(x0, R[i], y0, D[i]);}
}
int main() {int T;freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\input.txt", "r", stdin);freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\output.txt", "w", stdout);scanf("%d", &T);//cin >> T;for (int ti = 1; ti <= T; ti++) {scanf("%d%d", R, &n);for (int i = 1; i <= n; i++) {scanf("%d%d%d", D + i, L + i, R + i);}bool fl = simplecheck();if (!fl) {for (int i = 0; i <= n; i++) {double amn = 0, amx = pie;bool ok = true;for (int j = 0; j <= n && ok; j++) {double amnnow, amxnow;getAngInterval(L[i], D[i], j, amnnow, amxnow);if (amnnow > amx) {ok = false;break;}if (amxnow < amn) {ok = false;break;}amn = max(amn, amnnow);amx = min(amx, amxnow); //printf("From (%d, %d) to (%d, %d)->(%d, %d), ang [%.2f, %.2f], Overall [%.2f, %.2f]\n", L[i], D[i], L[j], D[j], R[j], D[j], amnnow * 180.0 / pie, amxnow * 180.0 / pie, amn * 180.0 / pie, amx * 180.0 / pie);
}if (ok) {fl = true;break;}}}if (fl) {puts("YES");}else puts("NO");}return 0;
}

View Code

转载于:https://www.cnblogs.com/xuesu/p/10993209.html

UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1相关推荐

  1. UVa 11627 - Slalom 二分. oj错误题目 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  2. UVa LA 3882 - And Then There Was One 递推,动态规划 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  3. hdu 4309(最大流+枚举状态)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4309 思路:2^12枚举修复哪些桥,不修复的桥没有花费,连接的边流量为1,要修复的桥则计算花费,边的流 ...

  4. LeetCode 2002. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)

    文章目录 1. 题目 2. 解题 2.1 超时 2.2 预处理优化 1. 题目 给你一个字符串 s ,请你找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 . 两个子序列在原字符串中如果 ...

  5. axios请求失败,response.data返回的状态码及错误信息获取

    axios请求失败,后端接口返回的状态码及错误信息获取 使用封装的elementUI后台框架,后台框架自定义封装并返回的code码转态(全部的返回数据,如下所示): 浏览器查看:返回的 error 信 ...

  6. vue 下载文件流和捕获后端返回的状态码和错误信息的方法

    文件流下载需要注意的是 responseType: 'blob' ,否则下载的文件不能正确打开.但是当数据库返回400时,捕获不到error的错误信息,因为responseType设置了固定的返回格式 ...

  7. 关于sata状态寄存器和错误寄存器的理解

    在AHCI协议中Port Register中有如下几个寄存器,我们这里主要关注PxSSTS和PxSERR 2. 什么是SCR寄存器 参考AHCI协议14.1章节 Sata host适配器包括了一个额外 ...

  8. [UVA 10605]钻石矿道【启发式搜索+状态压缩】

    [UVA 10605]钻石矿道 很好的一道题就是了,做了两遍了,要理清楚其中的状态转移,其余的倒是不难处理,这里的dp[ i ][ j ]表示的是我们这个一块,也就是它们被合并成一个块的包含j这个点的 ...

  9. Uva 1151 Buy or Build 二进制枚举+最小生成树

    题目描述 万维网(WWN)是一家运营大型电信网络的领先公司. WWN希望在Borduria建立一个新的网络,您需要帮助WWN确定如何以最低的总成本设置其网络.有几个本地公司运营着一些小型网络(以下称为 ...

最新文章

  1. OpenCV源码中Haar训练及特征提取的代码说明
  2. 企业网络带宽需求和跨地域网络连接的优化
  3. eclipse安装快速打开项目所在位置的插件
  4. PAT (Advanced Level) 1003 Emergency(最短路+动态规划)
  5. 搜索引擎设计实用教程(3)-以百度为例
  6. 关闭uboot MMU 会导致android2.3 S5pv210 系统不稳定?!why
  7. 软考考前冲刺第一章计算机硬件基础知识
  8. CS229——NODE1part1
  9. go新手看的开源项目 哪些适合_最近大家都在用 Go 语言玩什么?这几个新的开源项目告诉你...
  10. Mac下搭建手机APP开发环境(HBuilder X ,HTML5plus Runtime,MUI,springboot)
  11. 强烈推荐!入门大数据分析必看的知识点总结,适合零基础学习
  12. 通过Console口本地加载系统程序
  13. 刘海屏的MacBook Pro你会买吗?
  14. Luogu3834 【模板】可持久化线段树 1(主席树)
  15. java 编程题 实现双色球抽奖游戏中奖号码的生成
  16. 先正达谋定农化世界竞争格局-丰收节贸易会:座次重排
  17. Unity 引擎 Managed Stripping Level 遇到的坑
  18. 云服务器bcc搭建网站,云服务器BCC(Baidu Cloud Compute)介绍
  19. 2-SAT问题,一个神奇的东西
  20. 甘思咪哚,肉骨茶,Greenland

热门文章

  1. ubuntu 终端内查找/搜索
  2. Head First JSP---随笔八(传统标记)
  3. spring循环依赖及解决方法
  4. gdb 跟踪调试命令整理
  5. tensorflow2.x版本无法调用gpu的一种解决方法
  6. 使用google colab运行RNN网络代码报告错误ValueError: Object arrays cannot be loaded when allow_pickle=False
  7. 【IPFS + 区块链 系列】 入门篇 - IPFS环境配置
  8. Binder源码分析之Java层(原)
  9. IDA Pro ARM指令集和Thumb指令集的切换
  10. 如何在solaris下安装memcached