题解:

从左往右加入每一个点

判断一下和,pre,nxt是否相交

删除得时候也要判断

代码:

#pragma GCC optimize(2)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=;
typedef double ld;
const ld eps=1e-,C=0.18479956785822313167427314019291;
struct nd{int id,ls,rs,rk,fa;ld key;}t[N];
struct se{ld x1,y1,x2,y2,k,b;}s[N];
struct Tp{ld sg,x;int id;}p[N];
int n,m,rt,date[N];
int cmp(const Tp &a,const Tp &b){return (a.x<b.x);}
void rotate(ld &x,ld &y)
{
ld p=x,q=y;
x=cos(C)*p-sin(C)*q;
y=sin(C)*p+cos(C)*q;
}
int zig(int d)
{
int tmp=t[d].ls;
t[d].ls=t[tmp].rs;t[tmp].rs=d;
t[tmp].fa=t[d].fa;
t[d].fa=tmp;
if (t[d].ls) t[t[d].ls].fa=d;
return tmp;
}
int zag(int d)
{
int tmp=t[d].rs;
t[d].rs=t[tmp].ls;t[tmp].ls=d;
t[tmp].fa=t[d].fa;
t[d].fa=tmp;
if (t[d].rs) t[t[d].rs].fa=d;
return tmp;
}
int ins(int d,ld y,ld x,int id)
{
if (!d)
{
date[id]=++m;
t[m].key=y;t[m].id=id;
t[m].fa=;t[m].rk=rand();
return m;
}
ld _y=s[t[d].id].k*x+s[t[d].id].b;
if (fabs(y-_y)<=eps)
{
printf("YES\n%d %d\n",id+,t[d].id+);
exit();
}
if (y<_y)
{
t[d].ls=ins(t[d].ls,y,x,id);
t[t[d].ls].fa=d;
if (t[t[d].ls].rk<t[d].rk)return zig(d);
else return d;
}
t[d].rs=ins(t[d].rs,y,x,id);
t[t[d].rs].fa=d;
if (t[t[d].rs].rk<t[d].rk)return zag(d);
else return d;
}
int del(int d,ld y,ld x)
{
ld _y=s[t[d].id].k*x+s[t[d].id].b;
if (fabs(y-_y)<=eps)
{
if (!(t[d].ls+t[d].rs)) return ;
if ((t[d].ls)&&((!t[d].rs)||(t[t[d].ls].rk<t[t[d].rs].rk)))d=zig(d);
else d=zag(d);
return del(d,y,x);
}
if (y<_y)t[d].ls=del(t[d].ls,y,x);
else t[d].rs=del(t[d].rs,y,x);
return d;
}
int pre(int d)
{
if (t[d].ls)
{
for (d=t[d].ls;t[d].rs;d=t[d].rs);
return d;
}
while (d)
{
if (t[t[d].fa].rs==d) return t[d].fa;
d=t[d].fa;
}
return -;
}
int nxt(int d)
{
if (t[d].rs)
{
for (d=t[d].rs;t[d].ls;d=t[d].ls);
return d;
}
while (d)
{
if (t[t[d].fa].ls==d) return t[d].fa;
d=t[d].fa;
}
return -;
}
int det(ld x1,ld y1,ld x2,ld y2,ld x3,ld y3)
{
ld res=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
if (fabs(res)<=eps) return ;
if (res>) return ;
else return -;
}
int cr(int a,int b)
{
if ((a==-)||(b==-)) return ;
a=t[a].id;b=t[b].id;
if ((s[a].x1+eps>=min(s[b].x1,s[b].x2))&&(s[a].x1-eps<=max(s[b].x1,s[b].x2))
&&(!det(s[b].x1,s[b].y1,s[b].x2,s[b].y2,s[a].x1,s[a].y1)))return ;
if ((s[a].x2+eps>=min(s[b].x1,s[b].x2))&&(s[a].x2-eps<=max(s[b].x1,s[b].x2))
&&(!det(s[b].x1,s[b].y1,s[b].x2,s[b].y2,s[a].x2,s[a].y2)))return ;
if ((s[b].x1+eps>=min(s[a].x1,s[a].x2))&&(s[b].x1-eps<=max(s[a].x1,s[a].x2))
&&(!det(s[a].x1,s[a].y1,s[a].x2,s[a].y2,s[b].x1,s[b].y1)))return ;
if ((s[b].x2+eps>=min(s[a].x1,s[a].x2))&&(s[b].x2-eps<=max(s[a].x1,s[a].x2))
&&(!det(s[a].x1,s[a].y1,s[a].x2,s[a].y2,s[b].x2,s[b].y2)))return ;
if ((det(s[a].x1,s[a].y1,s[a].x2,s[a].y2,s[b].x1,s[b].y1)*
det(s[a].x1,s[a].y1,s[a].x2,s[a].y2,s[b].x2,s[b].y2)<)&&
(det(s[b].x1,s[b].y1,s[b].x2,s[b].y2,s[a].x1,s[a].y1)*
det(s[b].x1,s[b].y1,s[b].x2,s[b].y2,s[a].x2,s[a].y2)<))return ;
else return ;
}
int main()
{
scanf("%d",&n);
for (int i=;i<n;i++)
{
scanf("%lf%lf%lf%lf",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);
rotate(s[i].x1,s[i].y1);rotate(s[i].x2,s[i].y2);
if (s[i].x1>s[i].x2) swap(s[i].x1,s[i].x2),swap(s[i].y1,s[i].y2);
s[i].k=(s[i].y2-s[i].y1)/(s[i].x2-s[i].x1);
s[i].b=s[i].y1-s[i].k*s[i].x1;
p[i].id=p[i+n].id=i;
p[i].sg=;p[i+n].sg=;
p[i].x=s[i].x1;p[i+n].x=s[i].x2;
}
sort(p,p+n*,cmp);
for (int i=;i<n*;i++)
if (p[i].sg)
{
rt=ins(rt,s[p[i].id].y1,p[i].x,p[i].id);
if (cr(date[p[i].id],pre(m)))
{
printf("YES\n%d %d",p[i].id+,t[pre(m)].id+);
return ;
}
if (cr(date[p[i].id],nxt(m)))
{
printf("YES\n%d %d",p[i].id+,t[nxt(m)].id+);
return ;
}
}
else
{
if (cr(pre(date[p[i].id]),nxt(date[p[i].id])))
{
printf("YES\n%d %d",t[pre(date[p[i].id])].id+,
t[nxt(date[p[i].id])].id+);
return ;
}
rt=del(rt,s[p[i].id].y2,p[i].x);
}
puts("NO");
return ;
}

ural1469的更多相关文章

随机推荐

  1. 删除string类型字符串中指定字符串段

    1.实现背景 在插入list行时用邮件的MessageID给对应行命名. 在回复全部邮件时,收件人变为之前收件人中出去“自己”同时加入之前发件人,抄送人还是之前的抄送人,密送人不用管,直接不用带. 在 ...

  2. 【Apache】的运营之道

    1.“一个修修补补”的服务? 大家可能听说过 Apache 是一个双关语 “a patchy Web server”,意思为一个修修补补的 web 服务,即通过一系列的补丁做的服务.但是这并不是 Ap ...

  3. C++快速输入输出优化

    在这里存一下我的快速输入输出优化 以及写题模板 这里的是$getchar$优化和$putchar$优化,$fread$和$fwrite$暂时咕咕咕 快速输入 这里$define$了一个$I\_int$ ...

  4. Unity3D学习笔记(十五):寻路系统

    动画生硬切换:animation.play();//极少使用,常用融合方法 动画融合淡入:animation.CrossFade(“Idle”, 0.2f);//0.2f为与前一动画的融合百分比为20 ...

  5. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

  6. UVa 674 Coin Change(完全背包)

    https://vjudge.net/problem/UVA-674 题意: 计算兑换零钱的方法共有几种. 思路: 完全背包基础题. #include<iostream> #include ...

  7. UVa 815 洪水!

    https://vjudge.net/problem/UVA-815 题意:一个n*m的方格区域,共有n*m个方格,每个方格是边长为10米的正方形,整个区域的外围是无限高的高墙,给出这n*m个方格的初 ...

  8. LRU缓存淘汰算法

    什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,在有限的内容块中存储最近使用次数最多的数据,当内容块已满时,把最少使用的数据删除以便存储新的内容.

  9. windows7 asp.net发布IIS 拒绝访问 解决方法

    在windows7中打开DNN网站有以下问题: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP ...

  10. SpringBoot导入excle文件数据

    本文主要描述,Springboot框架下上传excel,处理里面相关数据做逻辑分析,由于用到的是前后端分离技术,这里记录的主要是后端java部分,通过与前端接口进行对接实现功能 1.在pom.xml文 ...