[xsy1100]东舰停战不可避
没有三点共线
这题的思想来源于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]东舰停战不可避的更多相关文章
- 珍爱生命,远离JS=>JS避坑记
JavaScript避坑记 转载请注明源地址: http://www.cnblogs.com/funnyzpc/p/8407952.html 上图=> 有意思的漫画,不知大家看懂了没,这里我想说 ...
- 黑马毕向东Java基础知识总结
Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记 侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...
- 中大东校小米路由器mini实现inode上网,ipv6 wifi【中大】【东校】【inode】【ipv6】
还有不到4个月就要毕业了,前几天半夜没事捣鼓小米路由没想到竟然实现了wifi的ipv6. 正好又安利了同学一台小米路由mini,从刷机到inode到ipv6全搞了一遍. 这里将教程写出来,服务学弟妹. ...
- 东哥读书小记 之 《MacTalk人生元编程》
一直以来的自我感觉:自己是个记性偏弱的人.反正从小读书就喜欢做笔记(可自己的字写得巨丑无比,尼玛不科学呀),抄书这事儿真的就常发生俺的身上. 因为那时经常要背诵课文之类,反正为了怕自己忘记, ...
- json是个啥东东
xml 不用说 只要是搞web开发的 没听说谁不知道的 一种类似数据传输格式定义的语言 但是他却不是一个真正的轻量级的东西 其他的不说 只要传输一点很少的数据 经过他那左括号右括号 还有什么属性 一包 ...
- 长见识了,知道了collected和Graphite 这两个东东
今天下午的讨论会议中,听到了两个名词collected和Graphite这是神马东东,以前在bingo的时候也没听说过,开完会下去查了下.原来他两是监控系统的啊.以前也从来没做过系统监控方面的项目,这 ...
- Win7普通版-X86-SP1-ios-旗舰版安装
------------------------------- 自己的电脑是X64Win7系统.Acer电脑----->>现在改装成 Win7普通版-X86-SP1-ios-旗舰版安装 ...
- BPEL是个什么东东
研究团队有个做智能服务组合的,其中用到叫BPEL的东西,因为全称是Business Process Execution Language,译成中文就是商业执行过程语言,这个东东的是整合SOA的一个执行 ...
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
随机推荐
- 解决Vue方法中setTimeout改变变量的值无效
把data里的变量继承过来重新封装一下 let that = this; this.rightAnswer = false; setTimeout(function() { that.rightAns ...
- Pycharm 创建 Django admin 用户名和密码
1. 问题 使用PyCharm 创建完Django 项目 想登录admin 页面 却不知道用户名和密码. 用的默认sqlit 2.解决办法 2.1 打开manage.py 控制界面 ...
- Eclipse开发环境配置,打磨Eclipse,安装插件(适用3.4,3.5,3.6,3.7)
转载自:http://elf8848.iteye.com/blog/354035 打磨Eclipse -- 磨刀不误砍柴工 -------------------------------------- ...
- js删除一个父元素下面的所有子元素
比如<div id="ok"><button tpye='button'>111111</button><p>22222</p ...
- [洛谷P2127] 序列排序
洛谷题目链接:序列排序 题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? ...
- 【LA3487】最小割-经典模型 两种方法
题目链接 题意:A.B两个公司要买一些资源(他们自己买的资源不会重复),一个资源只能卖给一个公司.问最大收益. simple input 部分: 54 1 //买到1就给54元 15 2 33 3 2 ...
- 1552: [Cerc2007]robotic sort
这道题用splay写 先离散化数据保证按题目所述顺序来写 按原序作为键值建树 维护区间最小值去跑 每次将i的位置 和 n的位置x和y找出来后 将x旋转到root y旋转到x的有儿子 这时y的左子树就是 ...
- [转载]超赞!32款扁平化Photoshop PSD UI工具包(下)
32款扁平化风格的UI工具包第二弹!上篇为大家分享了16款风格各异的UI Kits,下篇继续为大家呈上16款精美的UI工具包,全部都有Photoshop PSD文件可以下载哦,喜欢就赶紧收藏吧! 17 ...
- EL表达式中获取list长度(JSTL函数用法)
在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...
- 编辑器KindEditor的使用
1.具体使用方法看点这里 2.下载点这里 3.文件夹说明 ├── asp asp示例,删掉 ├── asp.net asp.net示例,删掉 ├── attached 空文件夹,放置关联文件attac ...