SGU315:The Highway Belt(DP)
来源:互联网 发布:收银机什么软件好 编辑:程序博客网 时间:2024/06/16 05:56
传送门(Vjudge)
题意:
给n条线段,用这些线段中的一些围成一个围绕原点的多边形,满足原点发出任意射线与此多边形只有一个交点。求满足条件的多边形的最大周长。
题解:
写了一种
首先求出所有线段的两端点和交点(用map判重),之后每条线段上的点都向逆时针方向所有在该线段上的点连边。
现在相当于求一个最大简单环,用
#include<bits/stdc++.h>using namespace std;inline int read(){ char ch=getchar();int i=0,f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){i=(i<<1)+(i<<3)+ch-'0';ch=getchar();} return i*f;}const double INF=1e9;const double eps=1e-9;const int Maxn=1e3+5e2+50;typedef pair<double,double> pii;inline int sgn(double x){ return (int)(x>eps)-(x<-eps);}struct point{ double x,y; point(double x=0,double y=0):x(x),y(y){} friend inline point operator -(const point &a,const point &b){return point(a.x-b.x,a.y-b.y);} friend inline double operator *(const point &a,const point &b){return a.x*b.y-a.y*b.x;} inline double norm(){return sqrt(x*x+y*y);} friend inline bool operator <(const point &a,const point &b){ int t=sgn(b.x-a.x); if(t)return t>0; else return (sgn(b.y-a.y)>0); } }p[Maxn];struct line{ point a,b; line(){} line(point a,point b):a(a),b(b){}}l[Maxn];inline point insert(const line &a,const line &b){ double k1=(a.b-b.a)*(a.a-b.a); double k2=(a.a-b.b)*(a.b-b.b); double t=((k1)/(k1+k2)); return point(b.a.x+(b.b.x-b.a.x)*t,b.a.y+(b.b.y-b.a.y)*t);}inline bool in(const point &a,const line &b){ return (a.x+eps>min(b.a.x,b.b.x))&&((a.x-eps<max(b.a.x,b.b.x)))&&(a.y+eps>min(b.a.y,b.b.y))&&(a.y-eps<max(b.a.y,b.b.y)); }int n,tot,slope[Maxn];map<point,int>S_p;vector<int>pre[Maxn];vector<int>pre2[Maxn];vector<int>line_p[Maxn];int is[55][Maxn];double f[Maxn][Maxn],d[Maxn][Maxn],ans;inline bool cmp_slope(const point &a,const point &b){ double t1=atan2(a.y,a.x),t2=atan2(b.y,b.x); return t1<t2;}inline bool exi(const point &a,const point &b){ for(int i=1;i<=n;i++){ if(fabs((l[i].a-a)*(l[i].b-a))>eps)continue; if(!in(a,l[i]))continue; if(fabs((l[i].a-b)*(l[i].b-b))>eps)continue; if(!in(b,l[i]))continue; return true; } return false;}int main(){ n=read(); for(int i=1;i<=n;i++){ point a,b; a.x=read(),a.y=read();b.x=read(),b.y=read(); if(!S_p.count(a))S_p.insert(make_pair(a,++tot)),p[tot]=a; if(!S_p.count(b))S_p.insert(make_pair(b,++tot)),p[tot]=b; l[i]=line(a,b); for(int j=1;j<i;j++){ point q=insert(l[i],l[j]); if(!in(q,l[i])||!in(q,l[j]))continue; if(!S_p.count(q))S_p.insert(make_pair(q,++tot)),p[tot]=q; } } sort(p+1,p+tot+1,cmp_slope); for(int i=1;i<=n;i++){ for(int j=1;j<=tot;j++){ if(fabs((l[i].a-p[j])*(l[i].b-p[j]))>eps)continue; if(in(p[j],l[i]))line_p[i].push_back(j); } } for(int i=1;i<=tot;i++) for(int j=1;j<=tot;j++) f[i][j]=(d[i][j]=(i==j?0:-INF)); for(int i=1;i<=n;i++){ int sz=line_p[i].size()-1; for(int t1=0;t1<=sz;++t1){ for(int t2=0;t2<=sz;++t2){ if(t1==t2)continue; int tt1=line_p[i][t1],tt2=line_p[i][t2]; if(p[tt1]*p[tt2]<eps)continue; d[tt1][tt2]=(p[tt1]-p[tt2]).norm(); pre[tt2].push_back(tt1); } } } static int vis[Maxn],vt; for(int i=1;i<=tot;i++){ ++vt; f[i][i]=0;pre2[i].push_back(i); for(int k=pre[i].size()-1;k>=0;k--){ int K=pre[i][k]; for(int j=pre2[K].size()-1;j>=0;j--){ int J=pre2[K][j]; f[J][i]=max(f[J][i],f[J][K]+d[K][i]); if(vis[J]!=vt)vis[J]=vt,pre2[i].push_back(J); } } for(int j=1;j<tot;j++){ if(d[i][j])ans=max(ans,f[j][i]+d[i][j]); } } (ans>eps)?printf("%.5f\n",ans):puts("0");}
阅读全文
0 0
- SGU315:The Highway Belt(DP)
- poj1912:A highway and the seven dwarfs(凸包)
- poj1751 Highway (Prim)
- Highway
- Line belt (三分查找)
- poj 2485 Highway(Kruskal)
- UVa 1615 - Highway(贪心)
- 块状数组(hdu3207 Highway)
- UVa 1615:Highway(贪心)
- hdu 3400 Line belt(三分)
- HDU 3400 Line belt(三分)
- Hdu 3400 Line belt (三分)
- HDU 3400 - Line belt (三分)
- hdu 3400 Line belt(三分法)
- uva 1265 - Tour Belt(生成树)
- HDU 3400 Line belt(嵌套三分)
- POJ 1912 A highway and the seven dwarfs(O(log N)求直线与凸包是否相交)
- POJ 1912 A highway and the seven dwarfs 已翻译
- 初识viewport
- 取消a标签在移动端点击时的背景颜色 && 去除ios手机端input输入框上方有阴影
- 梁胜博士:写给程序员的话(节选)
- 表间的关系一对多/一对一/多对多关系是怎样建立的?
- equals 和==的区别
- SGU315:The Highway Belt(DP)
- 全面认识区块链——私有区块链
- js实现分享功能
- http 学习笔记
- WebUtils封装返回值
- 前端面试之模块化-1、模块的写法
- 关于最小生成树的一些性质
- RedisTemplate.java
- 浅谈php接收POST数据的三种方式