当前位置: 首页 > news >正文

2732: [HNOI2012]射箭( 半平面交 )

很久没写题解了= =,来水一发吧= =

首先这道题很明显就是求y=ax^2+bx的是否有值取,每一个式子都代表着两个半平面,然后直接半平面交就行了

借鉴了hzwer的代码,还是特别简洁的说

CODE:

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cmath>

using namespace std;

typedef pair<long double,long double> ii;

typedef pair<ii,ii> line;

#define fi first

#define se second

#define maxn 101000

#define inf 1e15

#define exp 0

inline long double cross(ii x,ii y,ii z) {

return (x.fi-y.fi)*(x.se-z.se)-(x.se-y.se)*(x.fi-z.fi);

}

bool cmp(line x,line y) {return cross(x.fi,x.se,y.fi)>exp;}

line q[maxn*2];

long double tag[maxn*2];

bool cmp1(int x,int y) {if (tag[x]==tag[y]) return cmp(q[x],q[y]);return tag[x]<tag[y];} 

int l;

inline void init(){

q[1]=line(ii(-inf,-inf),ii(inf,-inf));

q[2]=line(ii(inf,-inf),ii(inf,inf));

q[3]=line(ii(inf,inf),ii(-inf,inf));

q[4]=line(ii(-inf,inf),ii(-inf,-inf));

l=4;

}

ii inter(line a,line b) {

long double k1,k2,t;

k1=cross(a.fi,b.se,a.se);

k2=cross(a.fi,a.se,b.fi);

t=k2/(k1+k2);

return ii(b.fi.fi+t*(b.se.fi-b.fi.fi),b.fi.se+t*(b.se.se-b.fi.se));

}

bool jud(line a,line b,line t) {

ii p=inter(a,b);

return cross(t.fi,p,t.se)>exp;

}

line a[maxn*2],deq[maxn*2];

int id[maxn*2];

inline bool check(int n) {

int num=0;

for (int i=1;i<=l;i++) if (id[i]<=n*2) a[++num]=q[id[i]];

int l,r;

deq[r=l=1]=a[1];

for (int i=2;i<=n*2;i++) {

while (r>l&&jud(deq[r-1],deq[r],a[i])) r--;

while (l<r&&jud(deq[l+1],deq[l],a[i])) l++;

deq[++r]=a[i];

}

while (l<r&&jud(deq[r-1],deq[r],deq[l])) r--;

while (l<r&&jud(deq[l+1],deq[l],deq[r])) l++;

return r-l>=2;

}

long double cal(long double a,long double b,long double x) {return b/a-a*x;}

int main(){

int n;

scanf("%d",&n);

init();

for (int i=1;i<=n;i++) {

int x1,y1,y2;

scanf("%d%d%d",&x1,&y1,&y2);

q[++l]=line(ii(-1,cal(x1,y1,-1)),ii(1,cal(x1,y1,1)));

q[++l]=line(ii(1,cal(x1,y2,1)),ii(-1,cal(x1,y2,-1)));

}

for (int i=1;i<=n*2+4;i++) {tag[i]=atan2(q[i].se.se-q[i].fi.se,q[i].se.fi-q[i].fi.fi);id[i]=i;}

sort(id+1,id+1+n*2+4,cmp1); 

int l=2,r=n+2;

while (l+1<r) {

int mid=(l+r)>>1;

if (check(mid)) l=mid;

else r=mid;

}

printf("%d\n",check(r)?r-2:l-2);

return 0;

}


转载于:https://www.cnblogs.com/New-Godess/p/4348895.html

相关文章:

  • 消灭Bug!十款免费移动应用测试框架推荐
  • css引入讲解及media
  • oracle数据类型
  • 使用SQL Server Audit记录数据库变更
  • PHPCMS实现文章置顶功能的方法
  • 关于函数返回值的一些见解
  • Git 的是使用入门
  • Hover States - 有趣的用户界面及交互设计
  • JavaScript Array创建数组
  • C缺陷与陷阱----读书笔记---第一章
  • 利用firefox调试安卓手机端web
  • 笔记:Java面向对象编程 第10章 类的生命周期
  • 锁定应用,解锁应用,锁卡,解卡,更改密码指令
  • Matlab的部分文件操作
  • 如何管理?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • download使用浅析
  • ES6核心特性
  • Go 语言编译器的 //go: 详解
  • js中forEach回调同异步问题
  • leetcode46 Permutation 排列组合
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 测试开发系类之接口自动化测试
  • 程序员最讨厌的9句话,你可有补充?
  • 从零开始在ubuntu上搭建node开发环境
  • 数据仓库的几种建模方法
  • 算法---两个栈实现一个队列
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (+4)2.2UML建模图
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (solr系列:一)使用tomcat部署solr服务
  • (WSI分类)WSI分类文献小综述 2024
  • (八)c52学习之旅-中断实验
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (利用IDEA+Maven)定制属于自己的jar包
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (推荐)叮当——中文语音对话机器人
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NetCore 如何动态路由
  • @FeignClient注解,fallback和fallbackFactory
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [<事务专题>]
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [2544]最短路 (两种算法)(HDU)
  • [AIGC] Spring Interceptor 拦截器详解
  • [FT]chatglm2微调
  • [IM] [Webhook] Webhook实现IM平台机器人
  • [Linux]于Mac在配置Linuxserver安装Nginx+PHP