UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
题目
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相关推荐
- UVa 11627 - Slalom 二分. oj错误题目 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVa LA 3882 - And Then There Was One 递推,动态规划 难度: 2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- hdu 4309(最大流+枚举状态)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4309 思路:2^12枚举修复哪些桥,不修复的桥没有花费,连接的边流量为1,要修复的桥则计算花费,边的流 ...
- LeetCode 2002. 两个回文子序列长度的最大乘积(状态压缩+枚举状态子集+预处理)
文章目录 1. 题目 2. 解题 2.1 超时 2.2 预处理优化 1. 题目 给你一个字符串 s ,请你找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 . 两个子序列在原字符串中如果 ...
- axios请求失败,response.data返回的状态码及错误信息获取
axios请求失败,后端接口返回的状态码及错误信息获取 使用封装的elementUI后台框架,后台框架自定义封装并返回的code码转态(全部的返回数据,如下所示): 浏览器查看:返回的 error 信 ...
- vue 下载文件流和捕获后端返回的状态码和错误信息的方法
文件流下载需要注意的是 responseType: 'blob' ,否则下载的文件不能正确打开.但是当数据库返回400时,捕获不到error的错误信息,因为responseType设置了固定的返回格式 ...
- 关于sata状态寄存器和错误寄存器的理解
在AHCI协议中Port Register中有如下几个寄存器,我们这里主要关注PxSSTS和PxSERR 2. 什么是SCR寄存器 参考AHCI协议14.1章节 Sata host适配器包括了一个额外 ...
- [UVA 10605]钻石矿道【启发式搜索+状态压缩】
[UVA 10605]钻石矿道 很好的一道题就是了,做了两遍了,要理清楚其中的状态转移,其余的倒是不难处理,这里的dp[ i ][ j ]表示的是我们这个一块,也就是它们被合并成一个块的包含j这个点的 ...
- Uva 1151 Buy or Build 二进制枚举+最小生成树
题目描述 万维网(WWN)是一家运营大型电信网络的领先公司. WWN希望在Borduria建立一个新的网络,您需要帮助WWN确定如何以最低的总成本设置其网络.有几个本地公司运营着一些小型网络(以下称为 ...
最新文章
- OpenCV源码中Haar训练及特征提取的代码说明
- 企业网络带宽需求和跨地域网络连接的优化
- eclipse安装快速打开项目所在位置的插件
- PAT (Advanced Level) 1003 Emergency(最短路+动态规划)
- 搜索引擎设计实用教程(3)-以百度为例
- 关闭uboot MMU 会导致android2.3 S5pv210 系统不稳定?!why
- 软考考前冲刺第一章计算机硬件基础知识
- CS229——NODE1part1
- go新手看的开源项目 哪些适合_最近大家都在用 Go 语言玩什么?这几个新的开源项目告诉你...
- Mac下搭建手机APP开发环境(HBuilder X ,HTML5plus Runtime,MUI,springboot)
- 强烈推荐!入门大数据分析必看的知识点总结,适合零基础学习
- 通过Console口本地加载系统程序
- 刘海屏的MacBook Pro你会买吗?
- Luogu3834 【模板】可持久化线段树 1(主席树)
- java 编程题 实现双色球抽奖游戏中奖号码的生成
- 先正达谋定农化世界竞争格局-丰收节贸易会:座次重排
- Unity 引擎 Managed Stripping Level 遇到的坑
- 云服务器bcc搭建网站,云服务器BCC(Baidu Cloud Compute)介绍
- 2-SAT问题,一个神奇的东西
- 甘思咪哚,肉骨茶,Greenland
热门文章
- ubuntu 终端内查找/搜索
- Head First JSP---随笔八(传统标记)
- spring循环依赖及解决方法
- gdb 跟踪调试命令整理
- tensorflow2.x版本无法调用gpu的一种解决方法
- 使用google colab运行RNN网络代码报告错误ValueError: Object arrays cannot be loaded when allow_pickle=False
- 【IPFS + 区块链 系列】 入门篇 - IPFS环境配置
- Binder源码分析之Java层(原)
- IDA Pro ARM指令集和Thumb指令集的切换
- 如何在solaris下安装memcached