发现由于角的度数和边的长度有限制,那俩圆如果放得下的话,必然是塞在两个角里。

于是预处理n个圆心的位置(注意要判断那个圆会不会和其他的边界相交),然后n^2枚举俩角即可。

#include<cstdio>
#include<cmath>
using namespace std;
#define EPS 0.00000001
struct Point{
double x,y;
double length(){
return sqrt(x*x+y*y);
}
}a[2010];
typedef Point Vector;
Vector unit(Vector v){
double l=v.length();
return (Vector){v.x/l,v.y/l};
}
Vector operator - (const Point &a,const Point &b){
return (Vector){a.x-b.x,a.y-b.y};
}
Vector operator + (const Point &a,const Point &b){
return (Vector){a.x+b.x,a.y+b.y};
}
double dot(const Vector &a,const Vector &b){
return a.x*b.x+a.y*b.y;
}
double Cross(const Vector &a,const Vector &b){
return a.x*b.y-a.y*b.x;
}
Vector operator * (const double &K,const Vector &v){
return (Vector){K*v.x,K*v.y};
}
int n;
Point calc(int I){
double jiao=acos(dot(a[I+1]-a[I],a[I-1]-a[I])/(a[I+1]-a[I]).length()/(a[I-1]-a[I]).length());
double d=4000.0/tan(jiao/2.0);
double l=4000.0/sin(jiao/2.0);
Point p1=a[I]+d*unit(a[I+1]-a[I]);
Point p2=a[I]+d*unit(a[I-1]-a[I]);
Point M=(Point){(p1.x+p2.x)/2.0,(p1.y+p2.y)/2.0};
return a[I]+l*unit(M-a[I]);
}
double DisToSegment(Point P,Point A,Point B)
{
Vector v1=B-A,v2=P-A,v3=P-B;
if(dot(v1,v2)<EPS) return v2.length();
else if(dot(v1,v3)>EPS) return v3.length();
else return fabs(Cross(v1,v2))/v1.length();
}
Point yuanxins[2010];
bool can[2010];
int main(){
// freopen("k.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lf%lf",&a[i].x,&a[i].y);
}
a[++n]=a[1];
for(int i=n;i>=1;--i){
a[i+1]=a[i];
}
a[1]=a[n];
++n;
for(int i=2;i<n;++i){
yuanxins[i]=calc(i);
can[i]=1;
for(int j=2;j<n;++j){
// double tmp=DisToSegment(yuanxins[i],a[j],a[j+1]);
if(DisToSegment(yuanxins[i],a[j],a[j+1])-4000.0<-EPS){
can[i]=0;
break;
}
}
}
for(int i=2;i<n;++i){
if(Cross(a[i+1]-a[i],a[i]-a[i-1])>EPS && can[i]){
Point A=yuanxins[i];
for(int j=i+1;j<n;++j){
if(Cross(a[j+1]-a[j],a[j]-a[j-1])>EPS && can[j]){
Point B=yuanxins[j];
// double tmp=(B-A).length();
if((B-A).length()-8000.0>-EPS){
printf("%.8f %.8f\n%.8f %.8f\n",A.x,A.y,B.x,B.y);
return 0;
}
}
}
}
}
puts("impossible");
return 0;
}

【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees的更多相关文章

  1. 【枚举】【SPFA】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem I. Iron and Coal

    那个人派出的队伍的行走的路径一定前半程是重合的,后半程分叉开来. 于是预处理每个点离1号点的最短路,到最近的铁的最短路,到最近的煤的最短路.(三次BFS / SPFA)然后枚举分岔点,尝试更新答案即可 ...

  2. 【强连通分量缩点】【DFS】【动态规划】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem B. British Menu

    有向图,不经过重复点的最长链,强连通分量大小不超过5. 每个强连通分量内部暴力预处理任意两对点之间的最长路,外面DAG上dp. 不是很好写,但是预处理完了之后,可以重构每个强连通分量内部的结构,然后整 ...

  3. 【二分】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem C. Careful Ascent

    二分Vx即可. #include<cstdio> #include<algorithm> using namespace std; #define EPS 0.00000000 ...

  4. 2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)

    A. Arranging Hat $f[i][j]$表示保证前$i$个数字有序,修改了$j$次时第$i$个数字的最小值. 时间复杂度$O(n^3m)$. #include <bits/stdc+ ...

  5. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  6. Petrozavodsk Summer Training Camp 2017

    Petrozavodsk Summer Training Camp 2017 Problem A. Connectivity 题目描述:有\(n\)个点,现不断地加边.每条边有一种颜色,如果一个点对\ ...

  7. Petrozavodsk Summer Training Camp 2017 Day 9

    Petrozavodsk Summer Training Camp 2017 Day 9 Problem A. Building 题目描述:给出一棵树,在树上取出一条简单路径,使得该路径的最长上升子序 ...

  8. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

  9. 2017 湖南省赛 K Football Training Camp

    2017 湖南省赛 K Football Training Camp 题意: 在一次足球联合训练中一共有\(n\)支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为 ...

随机推荐

  1. 编译zpool命令

    环境:192.168.50.239(在 illumos源码中编译zpool命令) PS:由于对zpool命令的工作原理不熟悉,所以编译,可在其中加入调试语句来明白其原理 首先介绍 illumos-so ...

  2. hdu 1253 胜利大逃亡(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡. #include <iostream> #i ...

  3. Spark实现销量统计

    package com.mengyao.examples.spark.core; import java.io.Serializable; import org.apache.hadoop.io.Nu ...

  4. mac cocoapod安装过程

    cocoapod: 自动化管理第三方开发包的一个插件, 废话不多说, 一个新手只需做如下几个步骤 1-> 安装ruby环境(可忽略, 不是必要) 1.1 首先我们先看看当前你机器上ruby的版本 ...

  5. P1968

    题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入输出格式 ...

  6. django “如何”系列10:如何管理静态文件

    django开发者最关心的是web应用中的动态部分-视图函数和模板.但是明显,web应用还有其他需要注意的部分:静态文件(图片,css,javascript等等),那些都是渲染一个完整的页面需要的东西 ...

  7. node自动调试

    supervisor 第一步:安装:npm -g install supervisor没有权限的时候可以sudo npm -g install supervisor 第二步:使用:supervisor ...

  8. rabbitmq在centos7下安装

    知识预览 一. RabbitMQ队列 二. 事例 三.基于RabbitMQ的RPC 回到顶部 一. RabbitMQ队列 ? 1 2 3 4 5 #消息中间件 -消息队列   - 异步 提交的任务不需 ...

  9. window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)

    关键区域(CriticalSection) 临界区是为了确保同一个代码片段在同一时间只能被一个线程访问,与原子锁不同的是临界区是多条指令的锁定,而原子锁仅仅对单条操作指令有效;临界区和原子锁只能控制同 ...

  10. 前端读者 | 前端用户体验-UI动效设计

    本文来自互联网 @羯瑞 整理 UI动效现如今在 APP 和网页中几乎已经成为了基本的组成部分,经过仔细打磨的 UI动效对于整个界面的提升是显著的. 动效呈现出状态切换的过程,展现了元素之间的逻辑关系, ...