[2019HDU多校第一场][HDU 6590][M. Code]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590
题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线将平面分割成黑白两部分
题解:分别对每种颜色的点求凸包,判断是否相交即可。
(有模板真好)
#include<bits/stdc++.h>
//#include<cstdio>
//#include<cmath>
//#include<algorithm>
using namespace std;
typedef long double lod;
typedef long long ll;
typedef long double ld;
const ld eps=1e-;
const ld pi=acos(-1.0);
int sgn(ld x)
{
if (x<-eps) return -;
if (x>eps) return ;
return ;
} struct P;
struct LINE;
struct CIRCLE;
struct TRIANGLE;
struct POLYGON; void kr(ld &x)
{
double t; scanf("%lf",&t);
x=t;
}
void kr(ll &x)
{
scanf("%lld",&x);
}
struct P
{
lod x,y;
void read()
{
kr(x); kr(y);
}
P operator+(const P &t)const
{
return {x+t.x,y+t.y};
}
P operator-(const P &t)const
{
return {x-t.x,y-t.y};
}
P operator*(ld t)const
{
return {x*t,y*t};
}
P operator/(ld t)const
{
return {x/t,y/t};
}
lod operator*(const P &t)const
{
return x*t.y-y*t.x;
}
lod operator%(const P &t)const
{
return x*t.x+y*t.y;
}
bool operator<(const P &t)const
{
return sgn(x-t.x)<||sgn(x-t.x)==&&sgn(y-t.y)<;
}
bool operator==(const P &t)const
{
return sgn(x-t.x)==&&sgn(y-t.y)==;
}
ld ang()const
{
return atan2(y,x);
}
ld length()const
{
return sqrt(x*x+y*y);
}
P rotate(const P &t,ld sita)const
{
return {(x-t.x)*cos(sita)-(y-t.y)*sin(sita)+t.x,
(x-t.x)*sin(sita)+(y-t.y)*cos(sita)+t.y};
}
ld btang(const P &t)const
{
return acos( (*this%t)/length()/t.length() );
}
P midvec(const P &t)const
{
return (*this)/length()+t/t.length();
}
}; struct LINE
{
P p1,p2;
void read()
{
p1.read(); p2.read();
}
LINE midLINE()
{
P midp=(p1+p2)/;
P v=p2-p1;
v=v.rotate({,},pi/);
return {midp,midp+v};
}
bool have1(const P &p)const
{
return sgn( (p-p1)*(p-p2) )==&&sgn( (p-p1)%(p-p2) )<=;
}
bool have2(const P &p)const
{
return sgn( (p-p1)*(p-p2) )==&&sgn( (p-p1)%(p2-p1) )>=;
}
bool have3(const P &p)const
{
return sgn( (p-p1)*(p-p2) )==;
}
lod areawith(const P &p)const
{
return abs( (p1-p)*(p2-p)/ );
}
P vecfrom(const P &p)const
{
P v=(p2-p1);
v=v.rotate({,},pi/);
ld s1=(p1-p)*(p2-p);
ld s2=v*(p2-p1);
v=v*(s1/s2);
return v;
}
P footfrom(const P &p)const
{
P v=vecfrom(p);
return p+v;
}
ld dis1from(const P &p)const
{
P foot=footfrom(p);
if (have1(foot)) return (foot-p).length();
return min( (p1-p).length(),(p2-p).length());
}
ld dis2from(const P &p)const
{
P foot=footfrom(p);
if (have2(foot)) return (foot-p).length();
return (p1-p).length();
}
ld dis3from(const P &p)const
{
return vecfrom(p).length();
}
P symP(const P &p)const
{
P v=vecfrom(p);
return p+v*;
}
bool isct11(const LINE &L)const
{
P a1=p1,a2=p2;
P b1=L.p1,b2=L.p2;
if (sgn( max(a1.x,a2.x)-min(b1.x,b2.x) )<||
sgn( max(b1.x,b2.x)-min(a1.x,a2.x) )<||
sgn( max(a1.y,a2.y)-min(b1.y,b2.y) )<||
sgn( max(b1.y,b2.y)-min(a1.y,a2.y) )<)
return ;
lod tmp1=(a2-a1)*(b1-a1);
lod tmp2=(a2-a1)*(b2-a1);
if (sgn(tmp1)<&&sgn(tmp2)<||sgn(tmp1)>&&sgn(tmp2)>) return ;
tmp1=(b2-b1)*(a1-b1);
tmp2=(b2-b1)*(a2-b1);
if (sgn(tmp1)<&&sgn(tmp2)<||sgn(tmp1)>&&sgn(tmp2)>) return ;
return ;
}
bool isct21(const LINE &L)const
{
P v=p2-p1;
P a=p1;
P b1=L.p1,b2=L.p2;
lod tmp1=v*(b1-a);
lod tmp2=v*(b2-a);
if (sgn(tmp1)<&&sgn(tmp2)<||sgn(tmp1)>&&sgn(tmp2)>) return ;
if (tmp1>tmp2) swap(b1,b2);
if (sgn( (b1-a)*(b2-a) )>) return ;
if (sgn( (b1-a)*(b2-a) )<) return ;
return L.have1(a)||have2(b1)||have2(b2);
}
bool isct31(const LINE &L)const
{
P v=p2-p1;
P a=p1;
lod tmp1=v*(L.p1-a);
lod tmp2=v*(L.p2-a);
if (sgn(tmp1)<&&sgn(tmp2)<||sgn(tmp1)>&&sgn(tmp2)>) return ;
return ;
}
bool isct22(const LINE &L)const
{
if (have2(L.p1)||L.have2(p1)) return ;
P v=vecfrom(L.p1);
if (sgn( v%(L.p2-L.p1) )<=) return ;
v=L.vecfrom(p1);
if (sgn( v%(p2-p1) )<=) return ;
return ;
}
bool isct32(const LINE &L)const
{
if (have3(L.p1)) return ;
P v=vecfrom(L.p1);
if (sgn( v%(L.p2-L.p1) )<=) return ;
return ;
}
bool isct33(const LINE &L)const
{
if (have3(L.p1)) return ;
return sgn( (p2-p1)*(L.p2-L.p1) )!=;
}
ld dis33(const LINE &L)const
{
return (L.p1-p1)*(L.p2-p1) / ( (p2-p1)*(L.p2-L.p1) )
* (p2-p1).length();
}
P isctPoint(const LINE &L)const
{
ld len=dis33(L);
P v=p2-p1;
return p1+v*(len/v.length());
} }; const int POLNUM=;
struct PL
{
ld len;
int v;
}stk[POLNUM];
int top;
bool cmplen(const PL &a,const PL &b)
{
return a.len<b.len;
}
P cent;
bool cmpang(const P &p1,const P &p2)
{
int tmp=sgn( (p1-cent).ang() - (p2-cent).ang() );
if (tmp!=) return tmp<;
return (p1-cent).length() < (p2-cent).length();
}
struct POLYGON
{
int n;
P a[POLNUM];
void read(int k)
{
for (int i=;i<=k;i++) a[i].read();
n=k;
}
void ChangetoConvex()
{
for (int i=;i<=n;i++)
if (a[i].x<a[].x||a[i].x==a[].x&&a[i].y<a[].y)
swap(a[],a[i]);
cent=a[];
sort(a+,a+n+,cmpang);
int top=;
for (int i=;i<=n;i++)
{
while(top>=&&
sgn((a[top]-a[top-])*(a[i]-a[top]))<= )
top--;
a[++top]=a[i];
}
n=top;
}
ld Clength()const
{
ld ret=;
for (int i=;i<=n;i++) ret+=(a[i]-a[i-]).length();
if (n>) ret+=(a[]-a[n]).length();
return ret;
}
bool have(const P p)
{
int k,d1,d2,wn=;
a[]=a[n];
for (int i=;i<=n;i++)
{
LINE L={a[i-],a[i]};
if (L.have1(p)) return ;
k=sgn( (a[i]-a[i-])*(p-a[i-]) );
d1=sgn( a[i-].y-p.y );
d2=sgn( a[i].y-p.y );
if (k>&&d1<=&&d2>) wn++;
if (k<&&d2<=&&d1>) wn--;
}
return wn!=;
}
ld cutlength(const LINE &L)
{
a[]=a[n]; top=;
for (int i=;i<=n;i++)
{
LINE R={a[i-],a[i]};
lod s1=sgn( (L.p2-L.p1)*(R.p1-L.p1) );
lod s2=sgn( (L.p2-L.p1)*(R.p2-L.p1) );
if (s1<&&s2<||s1==&&s2==||s1>&&s2>) continue;
if (s1<s2) stk[++top]={L.dis33(R),(s1!=&&s2!=?:)};
else stk[++top]={L.dis33(R),(s1!=&&s2!=?-:-)};
}
sort(stk+,stk+top+,cmplen);
int cnt=;
ld ret=;
for (int i=;i<=top;i++)
{
if (cnt) ret+=stk[i].len-stk[i-].len;
cnt+=stk[i].v;
}
return ret;
}
bool isct(const POLYGON &POL)const
{
for (int i=;i<=n;i++)
for (int j=;j<=POL.n;j++)
{
LINE L1={a[i-],a[i]};
LINE L2={POL.a[j-],POL.a[j]};
if (L1.isct11(L2)) return ;
}
return ;
}
ld isctarea(const POLYGON &POL)const;
}; int T,n,f[];
P p[];
POLYGON a,b;
int init()
{
a.n=b.n=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
p[i].read();
scanf("%d",&f[i]);
if(f[i]>)a.a[++a.n]=p[i];
else b.a[++b.n]=p[i];
}
if(a.n>b.n)swap(a,b);
if(!a.n)return printf("Successful!\n"),;
if(b.n==)
{
if((a.a[]-b.a[]).length()<eps)return printf("Infinite loop!\n"),;
return printf("Successful!\n"),;
}
b.ChangetoConvex();
for(int i=;i<=a.n;i++)
if(b.have(a.a[i]))return printf("Infinite loop!\n"),;
a.ChangetoConvex();
if(a.isct(b))return printf("Infinite loop!\n"),;
return printf("Successful!\n"),;
}
int main()
{
scanf("%d",&T);
while(T--)init();
return ;
}
[2019HDU多校第一场][HDU 6590][M. Code]的更多相关文章
- [2019HDU多校第一场][HDU 6578][A. Blank]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有 ...
- [2019HDU多校第一场][HDU 6580][C. Milk]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6580 题目大意:\(n\times m\)大小的方格上有\(k\)瓶水,喝完每瓶水都需要一定的时间.初 ...
- [2019HDU多校第一场][HDU 6584][G. Meteor]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\ ...
- [2019HDU多校第一场][HDU 6588][K. Function]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588 题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3] ...
- 2019HDU多校第一场1001 BLANK (DP)(HDU6578)
2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...
- [2019HDU多校第二场][HDU 6591][A. Another Chess Problem]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6591 题目大意:二维坐标系上,所有满足\(5|2x+y\)的点都被设为障碍物,无法通过.现给出一对点, ...
- 2019HDU多校第一场 BLANK DP
题意:有四种数字,现在有若干个限制条件:每个区间中不同的数字种类必须是多少种,问合法的方案数. 思路: 定义 dp[i][j][k][t] 代表填完前 t 个位置后,{0,1,2,3} 这 4 个数字 ...
- 2019HDU多校第一场 String 贪心
题意:给你一个字符串,问是否存在一个长度为m的子序列,子序列中对应字符的数目必须在一个范围内,问是否存在这样的字符串?如果存在,输出字典序最小的那个. 思路:贪心,先构造一个序列自动机,序列自动机指向 ...
- 2019HDU多校第一场 6582 Path 【最短路+最大流最小割】
一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to] ...
随机推荐
- 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its eleme ...
- Hadoop之HDFS介绍
1. 概述 HDFS是一种分布式文件管理系统. HDFS的使用场景: 适合一次写入,多次读出的场景,且不支持文件的修改: 适合用来做数据分析,并不适合用来做网盘应用: 1.2 优缺点 优点: 高容错性 ...
- 如何配置kindeditor的工具栏
kindeditor编辑器的工具栏主要是指编辑器输入框上方的那些可以操作的菜单,默认情况下编辑器是给予了所有的工具栏.针对不同的用户,不同的项目,不同的环境,可能就需要保留部分工具栏.那么我们应该如何 ...
- IPv4
1.IPv4分类地址 PC0(192.168.0.1) 和PC1(172.168.0.1)如果要ping通的话需要设置各自网关 PC0 设置IP 和 默认网关=路由器设置IP 2.Gigabit ...
- Netty源码剖析-启动服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...
- Ural 1248 Sequence Sum 题解
目录 Ural 1248 Sequence Sum 题解 题意 题解 程序 Ural 1248 Sequence Sum 题解 题意 给定\(n\)个用科学计数法表示的实数\((10^{-100}\s ...
- 剑指offer26:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
1 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2 思路和方法 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的 ...
- linux下mysql部署
mysql 1.拓扑结构 mysql集群有如下三层: 应用程序层:负责与mysql服务器通信的各种应用程序. Mysql服务器层:处理SQL命令,并与NDB存储引擎通信和Mysql服务器. NDB集群 ...
- varnish CLI管理
命令:varnishadm [-t timeout] [-S secret_file] [-T address:port] [-n name] [command [...]] ./varnishadm ...
- 美团CodeM初赛B轮 合并字符串的价值 (线段树,分类讨论)
输入两个字符串a和b,合并成一个串c,属于a或b的字符在c中顺序保持不变.如"ACG"和"UT"可以被组合成"AUCTG"或"AC ...