[hdu4667]Building Fence 计算几何 瞎瘠薄搞
大致题意:
给出n个圆和m个三角形,求最小的的,能将所有图形覆盖的图形的周长。
正解为求所有三角形顶点与圆的切点以及圆和圆的切点构造凸包,再求路径。
因为要求结果误差<=1e-3 所以 我们可以在每个圆上,将圆分为1000(或更多)等分,得到每个圆上有1000个点,把这些点和三角形的顶点构造凸包,为减小误差,圆上两点的距离依然为圆弧的长度。这样累加边即可得答案。
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<set>
- #include<map>
- #include<stack>
- #include<time.h>
- #include<cstdlib>
- #include<cmath>
- #include<list>
- using namespace std;
- #define MAXN 100100
- #define eps 1e-9
- #define For(i,a,b) for(int i=a;i<=b;i++)
- #define Fore(i,a,b) for(int i=a;i>=b;i--)
- #define lson l,mid,rt<<1
- #define rson mid+1,r,rt<<1|1
- #define mkp make_pair
- #define pb push_back
- #define cr clear()
- #define sz size()
- #define met(a,b) memset(a,b,sizeof(a))
- #define iossy ios::sync_with_stdio(false)
- #define fre freopen
- #define pi acos(-1.0)
- #define inf 1e6+7
- #define Vector Point
- const int Mod=1e9+;
- typedef unsigned long long ull;
- typedef long long ll;
- int dcmp(double x){
- if(fabs(x)<=eps) return ;
- return x<?-:;
- }
- struct Point{
- double x,y;
- int id;
- Point(double x=,double y=,int id=-):x(x),y(y),id(id) {}
- bool operator < (const Point &a)const{
- if(x==a.x) return y<a.y;
- return x<a.x;
- }
- Point operator - (const Point &a)const{
- return Point(x-a.x,y-a.y);
- }
- Point operator + (const Point &a)const{
- return Point(x+a.x,y+a.y);
- }
- Point operator * (const double &a)const{
- return Point(x*a,y*a);
- }
- Point operator / (const double &a)const{
- return Point(x/a,y/a);
- }
- void read(){
- scanf("%lf%lf",&x,&y);
- }
- void out(){
- cout<<"debug: "<<x<<" "<<y<<endl;
- }
- bool operator == (const Point &a)const{
- return dcmp(x-a.x)== && dcmp(y-a.y)==;
- }
- };
- double Dot(Vector a,Vector b) {
- return a.x*b.x+a.y*b.y;
- }
- double dis(Vector a) {
- return sqrt(Dot(a,a));
- }
- double Cross(Point a,Point b){
- return a.x*b.y-a.y*b.x;
- }
- int ConvexHull(Point *p,int n,Point *ch){
- int m=;
- For(i,,n-) {
- while(m> && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
- ch[m++]=p[i];
- }
- int k=m;
- Fore(i,n-,){
- while(m>k && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
- ch[m++]=p[i];
- }
- if(n>) m--;
- return m;
- }
- void Swap(int &p1,int &p2){
- p1^=p2;
- p2^=p1;
- p1^=p2;
- }
- int n,m;
- Point p[];
- Point ch[];
- Point cp[];
- double r[];
- void solve(){
- int rt=;
- For(i,,n-) cp[i].read(),scanf("%lf",&r[i]);
- For(i,,m-) p[rt].id=n,p[rt++].read(),p[rt].id=n,p[rt++].read(),p[rt].id=n,p[rt++].read();
- For(i,,n-) {
- For(j,,){
- double ang=*j*pi*1.0/;
- p[rt++]=Point(cp[i].x+r[i]*cos(ang),cp[i].y+r[i]*sin(ang),i);
- }
- }
- sort(p,p+rt);
- m=ConvexHull(p,rt,ch);
- double ans=;
- For(i,,m-) {
- if(ch[i].id==ch[(i+)%m].id && ch[i].id!=n) {
- ans+=pi**r[ch[i].id]/;
- }
- else ans+=dis(ch[i]-ch[(i+)%m]);
- }
- printf("%.5lf\n",ans);
- }
- int main(){
- // fre("in.txt","r",stdin);
- int t=;
- while(~scanf("%d%d",&n,&m)) solve();
- return ;
- }
[hdu4667]Building Fence 计算几何 瞎瘠薄搞的更多相关文章
- HDU 4667 Building Fence 计算几何 凸包+圆
1.三角形的所有端点 2.过所有三角形的端点对所有圆做切线,得到所有切点. 3.做任意两圆的外公切线,得到所有切点. 对上述所有点求凸包,标记每个点是三角形上的点还是某个圆上的点. 求完凸包后,因为所 ...
- hdu 4667 Building Fence < 计算几何模板>
//大白p263 #include <cmath> #include <cstdio> #include <cstring> #include <string ...
- HDU 4667 Building Fence(2013多校7 1002题 计算几何,凸包,圆和三角形)
Building Fence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)To ...
- 汕头市队赛 SRM14 T1 计算几何瞎暴力
计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...
- HDU 4667 Building Fence(求凸包的周长)
A - Building Fence Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u ...
- LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...
- zoj 3820 Building Fire Stations(树上乱搞)
做同步赛的时候想偏了,状态总是时好时坏.这状态去区域赛果断得GG了. 题目大意:给一棵树.让求出树上两个点,使得别的点到两个点较近的点的距离最大值最小. 赛后用O(n)的算法搞了搞,事实上这道题不算难 ...
- BZOJ1278: 向量vector(计算几何 随机化乱搞)
题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...
- C - Building Fence
Long long ago, there is a famous farmer named John. He owns a big farm and many cows. There are two ...
随机推荐
- Java设计模式の迭代器模式
迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...
- ECNA-A- Abstract Art
题目描述 Arty has been an abstract artist since childhood, and his works have taken on many forms. His l ...
- HDU 3926 并查集 图同构简单判断 STL
给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...
- CF760 D Travel Card 简单DP
link 题意:乘车,有3种票 1.20块坐1站 2.坐90分钟,50块 3.坐1440分钟,120块 现给出到达每个站的时间,问最优策略 思路: 简单DP,限定条件的3个转移方向,取最小的那个就行了 ...
- [php]手动搭建php开发环境(排错)
前提:针对自己的系统下载相应的php.apache.mysql,安装完毕后按照以下去配置httpd.conf和php.ini 本人用的是php5.6.4和apache2.4.4 一.Apache : ...
- Vue的keep-alive
Vue的keep-alive: 简答的做下理解 缓存!页面从某一个页面跳转到另一个页面的时候,需要进行一定的缓存,然后这个时候调用的钩子函数是actived,而在第一次加载的时候,created.ac ...
- 大聊Python----迭代器
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- 2013-7-31hibernate二级缓存
难得闲 Fckeditor Fckconfig.js大部分配置都在这里面, 增加字体: 程序代码: FCKConfig.FontNames = 'Arial;Comic Sans MS ...
- 给vim安装YouCompleteMe
要安装YouCompleteMe ,vim须支持python.看是否支持,可以在vim中:version 查看, 如果python前有+号,就是支持,减号就是不支持. 如果不支持,需要以编译安装方式重 ...
- MAC泛洪攻击
先来解释一下啥是泛洪攻击 交换机里有一张专门记录MAC地址的表,为了完成数据的快速转发,该表具有自动学习机制:泛洪攻击即是攻击者利用这种学习机制不断发送不同的MAC地址给交换机,充满整个MAC表,此时 ...