B Convex Polygon

B Convex Polygon

题意:

有n个点,每两个点组成一个坐标,现在问你是否所有的点可以构成一个凸多边形。并且这些点应该以顺时针方向输出。

题解:

很明显裸的凸包板子题,但是我们队里没人负责计算几何,当时抄的kuangbin板子,太啰嗦了,以后应该自己整理 ,然后又调了半小时
也算是复习一下凸包了
我们以为判断全了,结果忘了特判是不是所有点参与构成凸包,而错失八题

代码:

比赛代码:

#include<bits/stdc++.h>
using namespace std;
const int maxp=1020;
const double eps=1e-8;
const double pi=acos(-1.0);
typedef pair<int,int> pii;
#define x first
#define y second
#define double int
int sgn(double x){if(fabs(x)<eps)return 0;if(x<0)return -1;else return 1;
}
struct Point{double x,y;Point(){}Point(double _x,double _y){x=_x;y=_y;}bool operator==(Point b)const{return sgn(x-b.x)==0&&sgn(y-b.y)==0;}bool operator<(Point b)const{return sgn(x-b.x)==0?sgn(y-b.y)<0:x<b.x;}Point operator+(const Point &b)const {return Point(x+b.x,y+b.y);}Point operator-(const Point &b)const {return Point(x-b.x,y-b.y);}double operator^(const Point &b)const {return x*b.y-y*b.x; }double distance(Point p){return hypot(x-p.x,y-p.y);}};
struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s=_s;e=_e;}bool operator==(Line v){return (s==v.s)&&(e==v.e);}Line(Point p,double angle){s=p;if(sgn(angle-pi/2)==0){e=(s+Point(0,1));}else {e=(s+Point(1,tan(angle)));}}Line(double a,double b,double c){if(sgn(a)==0){s=Point(0,-c/b);e=Point(1,-c/b);}else if(sgn(b)==0){s=Point(-c/a,0);e=Point(-c/a,1);}else {s=Point(0,-c/b);e=Point(1,(-c-a)/b);}}};
const int N=110;
pii q[N];
int n;
struct polygon{int n;Point p[maxp];Line l[maxp];void input(int jcy){n=jcy;
//		cout<<n<<endl;for(int i=0;i<n;i++){p[i]=Point(q[i+1].x*1.0,1.0*q[i+1].y);
//			cout<<p[i].x<<" "<<p[i].y<<endl;
//			p[i].input();}}void getline(){for(int i=0;i<n;i++){l[i]=Line(p[i],p[(i+1)%n]);}} struct cmp{Point p;cmp(const Point &p0){p=p0;}bool operator()(const Point &aa,const Point &bb){Point a=aa,b=bb;int d=sgn((a-p)^(b-p));if(d==0){return sgn(a.distance(p)-b.distance(p))<0;}return d>0;}};void norm(){Point mi=p[0];for(int i=1;i<n;i++)mi=min(mi,p[i]);sort(p,p+n,cmp(mi));}void getconvex(polygon &convex){sort(p,p+n);convex.n=n;
//		for(int i=0;i<n;i++)	cout<<p[i].x<<" "<<p[i].y<<endl;
//		cout<<n<<endl;for(int i=0;i<min(n,2);i++){convex.p[i]=p[i];
//			cout<<convex.p[i].x<<endl;`````````````````````````````````````````````````````}if(convex.n==2&&(convex.p[0]==convex.p[1]))convex.n--;if(n<=2)return ;int &top=convex.n;top=1;for(int i=2;i<n;i++){while(top&&sgn((convex.p[top]-p[i])^(convex.p[top-1]-p[i]))<=0){top--;}convex.p[++top]=p[i];}int temp=top;convex.p[++top]=p[n-2];for(int i=n-3;i>=0;i--){while(top!=temp&&sgn((convex.p[top]-p[i])^(convex.p[top-1]-p[i]))<=0){top--;}convex.p[++top]=p[i];}if(convex.n==2&&(convex.p[0]==convex.p[1]))convex.n--;
//		convex.norm();}
}P;pii get(int a,int b,int c,int d){int dy=d-b;int dx=c-a;int dd=__gcd(dx,dy);dy/=dd;dx/=dd;if(dy<0)	dy*=-1,dx*=-1;return {dy,dx};
}
signed main (){int cnt=0;int x,y;string s;	cin>>s;vector<int>v;int res=0;int tot=0;for(int i=0;i<s.size();i++){if(s[i]==','){continue;}tot++;int j=i;int f=1;while(j<s.size()&&s[j]!=','){//1,1,1,3,-1,3if(s[j]=='-')		f*=-1;else{res=res*10+s[j]-'0';		}j++;}i=j-1;
//		cout<<res*f<<endl;v.push_back(f*res);res=0;}if(v.size()&1){cout<<"ERROR";return 0;}int D=1010;for(int i=0;i<v.size();i+=2){q[++n]={v[i]+D,v[i+1]+D};}if(n<=2){cout<<"ERROR";return 0;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++)if(i!=j && j!=k && i!=k){if(get(q[i].x,q[i].y,q[j].x,q[j].y)==get(q[j].x,q[j].y,q[k].x,q[k].y)){cout<<"ERROR";return 0;}}}}
//	cout<<n<<endl;P.input(n);P.getline(); polygon tt;P.getconvex(tt);double dist=1e18;int id=0;
//	cout<<tt.n<<endl;if(tt.n!=tot/2){cout<<"ERROR";return 0;}for(int i=0;i<tt.n;i++){tt.p[i].x-=D;tt.p[i].y-=D;
//		cout<<tt.p[i].x<<' '<<tt.p[i].y<<endl;if(tt.p[i].x*tt.p[i].x+tt.p[i].y*tt.p[i].y<dist){dist=min(dist,tt.p[i].x*tt.p[i].x+tt.p[i].y*tt.p[i].y);id=i;}}vector<pii>vv;
//	cout<<id<<endl;bool flag=false;for(int i=id;i<tt.n;i++){double x=tt.p[i].x;double y=tt.p[i].y;if(!flag)cout<<(int)x<<","<<(int)y,flag=true;elsecout<<","<<(int)x<<","<<(int)y;}for(int i=0;i<id;i++){double x=tt.p[i].x;double y=tt.p[i].y;if(!flag)cout<<(int)x<<","<<(int)y,flag=true;elsecout<<","<<(int)x<<","<<(int)y;}
//	for(int i=0;i<vv.size();i++){
//		
//		cout<<vv[i].x<<","<<vv[i].y;
//		if(i!=vv.size()-1)
//		cout<<",";
		if(i!=(int)vv.size()-1)
//		
//	}
//	
}

赛后代码:

#include<bits/stdc++.h>
using namespace std;const double eps = 1e-12;
#define Point pair<double,double>
#define x first
#define y secondint sign(double x)
{if(fabs(x) < eps) return 0;return x<0 ? -1:1;
}
Point operator-(Point a, Point b) {return {a.x-b.x, a.y-b.y};} // 向量 
double cross(Point a, Point b) {return a.x * b.y - b.x * a.y;} // 叉积 
double area(Point a, Point b, Point c) {return cross(b-a, c-a);} // 判向 
double get_dis(Point a, Point b)
{double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx * dx + dy * dy);
}int n,top;
bool vis[110];
Point pt[10010];
int stk[10010];
void Graham()
{sort(pt+1, pt+1+n);top = 0;int ck;for(int i=1;i<=n;i++){while(top>1 && (ck = sign(area(pt[stk[top-1]], pt[stk[top]], pt[i]))) <= 0){vis[stk[top]] = 0;top--;}stk[++top] = i;vis[i] = 1;}vis[1] = 0;for(int i=n;i>=1;i--){if(vis[i]) continue;while(top>1 && sign(area(pt[stk[top-1]], pt[stk[top]], pt[i])) <= 0)top--;stk[++top] = i;}if(stk[top]==1) top--;
}
bool check()
{for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){for(int k=j+1;k<=n;k++){if(sign(area(pt[i], pt[j], pt[k])) == 0)return 1;}}}return 0;
}
void solve()
{n = 0;char c;double x,y;while(scanf("%lf,%lf",&x, &y)!=EOF){pt[++n] = {x,y};scanf("%c",&c);}if(check()){cout<<"ERROR"<<endl;return ;}Graham();if(top!=n)cout<<"ERROR"<<endl;else{Point cc = {0,0};int k = 1;for(int i=2;i<=top;i++){if(get_dis(pt[stk[i]],cc) < get_dis(pt[stk[k]],cc))k = i;}for(int i=1;i<=top;i++){printf("%.0lf,%.0lf",pt[stk[k]].x, pt[stk[k]].y);if(i!=top) printf(",");k--;if(k==0) k = top;}}
}
int main()
{freopen("data.in","r",stdin); solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的

在昨天的技术周会上发现 EnyimMemcached 中建立 Socket 连接的代码有问题&#xff0c;今天坐车的时候在手机上阅读 .net core 2.2 的 SqlClient 中同步建立 Socket 连接的代码 SNITcpHandle.cs#L180 学习了一下。建立 Socket 连接需要处理2个问题&#xff1a;1&#xff09;处理…

CF1245D Shichikuji and Power Grid

CF1245D Shichikuji and Power Grid 题意&#xff1a; 已知一个平面上有 n 个城市&#xff0c;需要个 n 个城市均通上电 一个城市有电&#xff0c;必须在这个城市有发电站或者和一个有电的城市用电缆相连 在一个城市建造发电站的代价是 c[i] i 和 j两个城市相连的代价是 k[…

NetCore + SignalR 实现日志消息推送

哈喽大家周一好呀&#xff0c;感觉好久没有写文章了&#xff0c;上周出差了一次&#xff0c;感觉还是比坐办公室好的多&#xff0c;平时在读一本书《时生》&#xff0c;感兴趣的可以看看?......这几天翻看 NetCore 相关知识扩展的时候&#xff0c;发现了久违的一个知识点 ——…

CF1245F Daniel and Spring Cleaning(等会了更新)

CF1245F Daniel and Spring Cleaning 题意&#xff1a; 给定l&#xff0c;r&#xff0c;求∑alr∑blr[aba⊕b]\sum_{al}^{r}\sum_{bl}^{r}[aba⊕b]∑alr​∑blr​[aba⊕b] 题解&#xff1a; 对于这个式子&#xff0c;只有当a和b都不为0时成立&#xff0c;也就是我们不求 对…

使用Entity Framework Core访问数据库(DB2篇)

上一篇讲了一些EF Core访问Oracle的坑。&#xff08;感兴趣请移步&#xff1a;使用Entity Framework Core访问数据库&#xff08;Oracle篇&#xff09;&#xff09;这篇主要讲一下关于EF Core访问DB2的一揽子~问题。本篇采用DBFirst直接生成实体。关于EF Core DB2 的官方文档&a…

Linux中以单容器部署Nginx+ASP.NET Core

正如前文提到的&#xff0c;强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器&#xff0c;本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程。Nginx->ASP.NET Coe部署架构容器化在Docker中部署Nginx--->ASP.NETCore 有两种选择&#x…

计算几何专题

选自计算几何专题 二维&#xff1a; 一。点&#xff0c;线&#xff0c;面&#xff0c;形基本关系&#xff0c;点积叉积的理解 POJ 2318 POJ 2398 POJ 1269 POJ 1556 POJ 2653 POJ 1066 POJ 1410 POJ 1696 POJ 3347 POJ 2826 POJ 1039 POJ 3449 POJ 1584 POJ 2074 二。凸包问…

领域驱动设计学习之路—DDD的原则与实践

本文是我学习Scott Millett & Nick Tune编著的《领域驱动设计模式、原理与实践》一书的学习笔记&#xff0c;一共会分为4个部分如下&#xff0c;此文为第1部分&#xff1a;领域驱动设计的原则与实践战略模式&#xff1a;在有界上下文之间通信战术模式&#xff1a;创建有效的…

Xor HDU - 6899

Xor HDU - 6899 题意&#xff1a; 给你A&#xff0c;B&#xff0c;K&#xff0c;W&#xff0c;问现在有多少个(x,y)满足下列形式&#xff1f; x,y都是整数x∈[0,A],y∈[0,B]|x-y|<kx xor y<W 题解&#xff1a; 数位dp 对于第1&#xff0c;2&#xff0c;4都是经典的数…

.NET Core中使用Dapper操作Oracle存储过程最佳实践

为什么说是最佳实践呢&#xff1f;因为在实际开发中踩坑了&#xff0c;而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为OracleDbType.RefCursor&#xff0c;输出为&#xff1a;ParameterDirection.Output数据的时候。网上千篇一律的说写一个Ora…

Sum of Log(2020上海C)

Sum of Log 题意&#xff1a; 求∑i0X∑j[i0]Y[i&j0]⌊log2(ij)1⌋\sum_{i0}^{X}\sum_{j[i0]}^{Y}[i\&j0]\lfloor log_{2}(ij)1\rfloor∑i0X​∑j[i0]Y​[i&j0]⌊log2​(ij)1⌋ 题解&#xff1a; 数位dp 如果式子想有意义&#xff0c;i&j就要等于0&#xf…

CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB

一、多样输出支持CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件&#xff0c;它可以随着ASP.NET Core实例的启动而启动&#xff0c;目前采用轮询的方式对Canal Server进行监听&#xff0c;获得MySql行更改&#xff08;RowChange&#xff09…

CF1039C Network Safety

CF1039C Network Safety 题意&#xff1a; 题解&#xff1a; 如果我们同时选中a&#xff0c;b两个点&#xff0c;无论异或什么值&#xff0c;都不会影响图的安全性&#xff0c;因为图本来就是安全的 破坏图的安全性只有一种情况&#xff0c;那就是选了a&#xff0c;没选b&…

使用Jenkins来实现内部的持续集成流程(下)

目录配置项目构建添加任务添加源代码地址和登录凭据添加构建触发器 TFS添加WebHook 添加构建步骤后端UI API端 配置项目构建1添加任务2添加源代码地址和登录凭据添加源代码地址和登录凭证此图没有填写凭证时显示的错误点击Credential后面的添加 填写能访问源代码的用户名和密码…

Visible Trees HDU - 2841(容斥)

Visible Trees HDU - 2841 题意&#xff1a; 大概就是有个m*n个点的矩形从(1,1)到(m,n)&#xff0c;问从(0,0)出发直线看过去最多能看到几个点。 题解&#xff1a; 容斥做法参考 这个题和AcWing 201. 可见的点一样的&#xff0c;但是这里介绍不同的做法&#xff0c;用容斥做…

.NET和Docker ,比翼双飞

DockerCon 2019本周将在旧金山举行 &#xff0c;DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团队博客发布了《一起使用.NET和Docker - DockerCon 2019更新》&#xff1a;https://devblogs.microsoft.com/dotnet/using-net-…

Visible Lattice Points SPOJ - VLATTICE

Visible Lattice Points SPOJ - VLATTICE 题意&#xff1a; 有一个n∗n∗n的三维直角坐标空间&#xff0c;问从(0,0,0)看能看到几个点。 题解&#xff1a; 本题是二维的一个升级版&#xff0c;升级成三维 用莫比乌斯反演来做 代码&#xff1a; #include <bits/stdc.h…

使用ASP.NET Core开发GraphQL服务器 -- 极简预备知识(上)

为了介绍使用ASP.NET Core构建GraphQL服务器&#xff0c;本文需要介绍一下GraphQL&#xff0c;其实看官网的文档就行。什么是GraphQL&#xff1f;GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描…

GCD HDU - 1695

GCD HDU - 1695 题意&#xff1a; 给出a,b,c,d,k,求出a<x<b, c<y<d 且gcd(x,y) k 的&#xff08;x,y&#xff09;的对数。 求的是不同数量对的总数 题解&#xff1a; 和这个题一样P3455 [POI2007]ZAP-Queries&#xff0c;但是本题要求求不同数量对的总数&…

使用 dotnet 命令行配合 vscode 完成一个完整 .NET 解决方案的编写和调试

如果你是开发个人项目&#xff0c;那就直接用 Visual Studio Community 版本吧&#xff0c;对个人免费&#xff0c;对小团体免费&#xff0c;不需要这么折腾。如果你是 Mac / Linux 用户&#xff0c;不想用 Visual Studio for Mac 版&#xff1b;或者不想用 Visual Studio for …