没有三点共线

这题的思想来源于JOI2011-2012春季训练合宿Day2T2,原题是个大毒瘤题(p.s.场上有人A,真的可怕),这题作为原题要用到的的一个结论而存在

点有两种颜色,先考虑对所有点做凸包,假如凸包上的颜色段大于$2$段,那么无解

因为连线一定在凸包内部,所以上图中红色和蓝色不可能不相交而连接起来

为了做这题,首先我们描述一个过程:$solve(A,B,C)$,其中$B,C$颜色相同且已经直接或间接地被连起来,$A$是另一种颜色,这个过程可以把$\triangle ABC$内的所有点按对应颜色连起来且连线不相交

solve($A$,$B$,$C$){

  if($\exists P$ in $\triangle ABC$ and $P.color$==$A.color$){
    link($A$,$P$);
    solve($B$,$A$,$P$);
    solve($C$,$A$,$P$);
    solve($P$,$B$,$C$);
  }else{
    link all $P$ in $\triangle ABC$ with $B$ or $C$
  }
}

代码应该挺容易懂的,如果找到和$A$同色的点就可以递归做,否则把所有三角形内的点用某种方式与$B,C$连接起来,我用的方法是把所有点极角排序,然后把每个点和左下角的点连起来

要处理两种情况

①凸包上所有点同色

把凸包上连一圈,然后再内部随便找一个不同颜色的点$P$,以它为中心绕着调用$solve(P,hull_i),hull_{i+1}$

②凸包上有两段颜色

把凸包上相同颜色的连起来,然后如图所示

就是找到每段颜色的第一个点和另一边的每一条边组成的三角形调用$solve$就可以了

因为没有三点共线,所以这样做一定可以得出答案

东舰共荣还行==

#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 2147483647
struct point{
	int x,y,bl,id;
	double ang;
	void get(){
		if(x==0)
			ang=(y==0)?-inf:inf;
		else
			ang=y/(double)(x);
	}
	point(int a=0,int b=0){x=a;y=b;}
}p[3010],h[3010],t[3010];
int N,n,m,stk[3010];
bool cmp1(point a,point b){return a.ang<b.ang;}
bool cmp2(point a,point b){return a.id<b.id;}
int nex(int x){
	if(x<N)return x+1;
	return 1;
}
point operator-(point a,point b){
	return point(a.x-b.x,a.y-b.y);
}
ll cross(point a,point b){
	return a.x*(ll)b.y-a.y*(ll)b.x;
}
int conv(){
	sort(p+1,p+n+m+1,cmp1);
	int i,top;
	top=2;
	stk[1]=1;
	stk[2]=2;
	for(i=3;i<=n+m;i++){
		while(top>1&&cross(p[stk[top]]-p[stk[top-1]],p[i]-p[stk[top]])<0)top--;
		top++;
		stk[top]=i;
	}
	for(i=1;i<=top;i++)h[i]=p[stk[i]];
	sort(p+1,p+n+m+1,cmp2);
	return top;
}
struct edge{
	int x,y;
	edge(int a=0,int b=0){x=a;y=b;}
}e[3010];
int tot;
void add(int x,int y){
	tot++;
	e[tot]=edge(x,y);
}
bool intri(point a,point b,point c,point d){
	if(cross(b-a,c-b)<0)swap(b,c);
	return cross(d-b,a-d)>0&&cross(d-c,b-d)>0&&cross(d-a,c-d)>0;
}
void gao(int a,int b,int c){
	int i,e,mx,my;
	for(i=1;i<=n+m;i++){
		if(p[i].bl==p[a].bl&&intri(p[a],p[b],p[c],p[i])){
			add(a,i);
			gao(b,a,i);
			gao(c,a,i);
			gao(i,b,c);
			return;
		}
	}
	e=1;
	t[1]=p[b];
	for(i=1;i<=n+m;i++){
		if(intri(p[a],p[b],p[c],p[i])){
			e++;
			t[e]=p[i];
		}
	}
	mx=inf;
	for(i=1;i<=e;i++){
		if(t[i].x<mx||(t[i].x==mx&&t[i].y<my)){
			mx=t[i].x;
			my=t[i].y;
		}
	}
	for(i=1;i<=e;i++){
		t[i].x-=mx;
		t[i].y-=my;
		t[i].get();
	}
	sort(t+1,t+e+1,cmp1);
	for(i=2;i<=e;i++)add(t[1].id,t[i].id);
}
int main(){
	int i,mx,my,ct;
	scanf("%d%d",&n,&m);
	mx=inf;
	for(i=1;i<=n+m;i++){
		scanf("%d%d",&p[i].x,&p[i].y);
		if(p[i].x<mx||(p[i].x==mx&&p[i].y<my)){
			mx=p[i].x;
			my=p[i].y;
		}
		p[i].id=i;
		if(i>n)p[i].bl=1;
	}
	for(i=1;i<=n+m;i++){
		p[i].x-=mx;
		p[i].y-=my;
		p[i].get();
	}
	N=conv();
	ct=0;
	for(i=1;i<=N;i++){
		if(h[i].bl!=h[nex(i)].bl)ct++;
	}
	if(ct>2){
		puts("touhou-kancolle war can not be avoided!");
		return 0;
	}
	if(ct==0){
		for(i=1;i<N;i++)add(h[i].id,h[i+1].id);
		for(i=1;i<=n+m;i++){
			if(p[i].bl!=h[1].bl){
				mx=i;
				break;
			}
		}
		for(i=1;i<=N;i++)gao(mx,h[i].id,h[nex(i)].id);
	}else{
		for(i=1;h[i].bl==h[nex(i)].bl;i=nex(i));
		for(i=nex(i);h[i].bl==h[nex(i)].bl;i=nex(i))add(h[i].id,h[nex(i)].id);
		for(i=nex(i);h[i].bl==h[nex(i)].bl;i=nex(i))add(h[i].id,h[nex(i)].id);
		mx=i;
		for(i=nex(i);h[i].bl==h[nex(i)].bl;i=nex(i))gao(h[mx].id,h[i].id,h[nex(i)].id);
		mx=i;
		for(i=nex(i);h[i].bl==h[nex(i)].bl;i=nex(i))gao(h[mx].id,h[i].id,h[nex(i)].id);
	}
	for(i=1;i<=tot;i++){
		if(p[e[i].x].bl==0)printf("%d %d\n",e[i].x,e[i].y);
	}
	for(i=1;i<=tot;i++){
		if(p[e[i].x].bl==1)printf("%d %d\n",e[i].x-n,e[i].y-n);
	}
}

[xsy1100]东舰停战不可避的更多相关文章

  1. 珍爱生命,远离JS=>JS避坑记

    JavaScript避坑记 转载请注明源地址: http://www.cnblogs.com/funnyzpc/p/8407952.html 上图=> 有意思的漫画,不知大家看懂了没,这里我想说 ...

  2. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  3. 中大东校小米路由器mini实现inode上网,ipv6 wifi【中大】【东校】【inode】【ipv6】

    还有不到4个月就要毕业了,前几天半夜没事捣鼓小米路由没想到竟然实现了wifi的ipv6. 正好又安利了同学一台小米路由mini,从刷机到inode到ipv6全搞了一遍. 这里将教程写出来,服务学弟妹. ...

  4. 东哥读书小记 之 《MacTalk人生元编程》

         一直以来的自我感觉:自己是个记性偏弱的人.反正从小读书就喜欢做笔记(可自己的字写得巨丑无比,尼玛不科学呀),抄书这事儿真的就常发生俺的身上. 因为那时经常要背诵课文之类,反正为了怕自己忘记, ...

  5. json是个啥东东

    xml 不用说 只要是搞web开发的 没听说谁不知道的 一种类似数据传输格式定义的语言 但是他却不是一个真正的轻量级的东西 其他的不说 只要传输一点很少的数据 经过他那左括号右括号 还有什么属性 一包 ...

  6. 长见识了,知道了collected和Graphite 这两个东东

    今天下午的讨论会议中,听到了两个名词collected和Graphite这是神马东东,以前在bingo的时候也没听说过,开完会下去查了下.原来他两是监控系统的啊.以前也从来没做过系统监控方面的项目,这 ...

  7. Win7普通版-X86-SP1-ios-旗舰版安装

    ------------------------------- 自己的电脑是X64Win7系统.Acer电脑----->>现在改装成  Win7普通版-X86-SP1-ios-旗舰版安装 ...

  8. BPEL是个什么东东

    研究团队有个做智能服务组合的,其中用到叫BPEL的东西,因为全称是Business Process Execution Language,译成中文就是商业执行过程语言,这个东东的是整合SOA的一个执行 ...

  9. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

随机推荐

  1. 【BZOJ】2453: 维护队列【BZOJ】2120: 数颜色 二分+分块(暴力能A)

    先说正解:把所有相同的数相成一个链在每一个区间里的种数就是不同链的链头,那么记录每个数的上个相同数所在位置,那么只要找出l到r之间前驱值在l之前的数的个数就可以了 本人打的暴力,有一个小技巧,用cha ...

  2. JS让任意图片垂直水平居中且页面不滚动

    说一下以前遇到的一个问题: 假设有一张小图,要实现点击查看大图的功能,而这个图的宽高可能会超过浏览器的宽高,这时候我们通过JS来改变图片的宽高,从而实现图片在浏览器居中显示且不滚屏. 方法如下: 首先 ...

  3. Educational Codeforces Round 58 (Rated for Div. 2) 题解

    Educational Codeforces Round 58 (Rated for Div. 2)  题目总链接:https://codeforces.com/contest/1101 A. Min ...

  4. Spring学习--泛型依赖注入

    暂时没有搞懂.

  5. Linux下设置防火墙(开启端口)

    1.修改文件/etc/sysconfig/iptables 在文件中加入如下内容,目的是对外界开放7001端口 -A RH-Firewall-1-INPUT -m state --state NEW ...

  6. 【Foreign】旅行路线 [倍增]

    旅行路线 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 3 2 ...

  7. bzoj3779: 重组病毒 link-cut-tree

    题目传送门 这道题看了做了个神转换.....推荐个博客给各位大爷看看吧神犇传送门 代码敲了半天....题目也读了半天 线段树维护的东西很容易和lct混在一起 调了调能过也是很开心啊 运气比较好吧233 ...

  8. 2017年上海金马五校程序设计竞赛:Problem I : Frog's Jumping (找规律)

    Description There are n lotus leaves floating like a ring on the lake, which are numbered 0, 1, ..., ...

  9. 矩阵快速幂&T1

    T1 知识储备 在写这一题之前,我们首先要了解矩阵乘法(我就是因为不懂弄了好久...) 矩阵的运算()-----(信息学奥赛一本通之提高篇) 矩阵的加法减法是十分简单的,就是把2个矩阵上对应的位置相加 ...

  10. 【JAVA】Eclipse中使用git进行pull远程代码

    当使用eclipse或者MyEclipse进行pull远程代码的时候,或者github的代码的时候报如下错误代码: 代表我们没有配置我们的Git地址,这里我教大家配置一下.首先下面是错误代码: The ...