平面上n个点,点之间沿直线走,规划一条路线,每次只能往左半平面的点走,走过最多的点。

显然所有的点都能走过。

n^2的暴力显然是每次找左边与其所形成夹角最小的点,但这样过不了(卡常数?)。

或者每轮不断求凸包。有个非常巧妙的地方是将每一轮输出后剩下的最后一个点加到下一轮的点里面一起求凸包,这样只要按逆时针输出每一轮,就能满足。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
struct Point{
ll x,y;
int id;
Point(const ll &x,const ll &y){
this->x=x;
this->y=y;
}
Point(){}
};
typedef Point Vector;
bool cmp(const Point &a,const Point &b){
return a.x!=b.x ? 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);
}
ll Cross(const Vector &a,const Vector &b){
return a.x*b.y-a.y*b.x;
}
Point ps[5010],qs[10010];
int k;
bool vis[5010];
void convex_hull(){
k=0;
for(int i=0;i<n;++i)if(!vis[ps[i].id]){
while(k>1 && Cross(qs[k-1]-qs[k-2],ps[i]-qs[k-1])<=0){
--k;
}
qs[k++]=ps[i];
}
for(int i=n-2,t=k;i>=0;--i)if(!vis[ps[i].id]){
while(k>t && Cross(qs[k-1]-qs[k-2],ps[i]-qs[k-1])<=0){
--k;
}
qs[k++]=ps[i];
}
--k;
}
int main(){
// freopen("h.in","r",stdin);
// freopen("h.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%lld%lld",&ps[i].x,&ps[i].y);
ps[i].id=i+1;
}
sort(ps,ps+n,cmp);
int e=0;
printf("%d\n",n);
int I=0;
int last;
while(n-e>1){
++I;
convex_hull();
int ID;
if(I==1){
ID=0;
}
else{
for(int i=0;i<k;++i){
if(last==qs[i].id){
ID=i;
break;
}
}
}
for(int i=ID;i<(ID==0 ? k-1 : k);++i){
++e;
vis[qs[i].id]=1;
printf("%d%c",qs[i].id,e==n?'\n':' ');
}
for(int i=0;i<ID-1;++i){
++e;
vis[qs[i].id]=1;
printf("%d%c",qs[i].id,e==n?'\n':' ');
}
if(ID==0){
last=qs[k-1].id;
}
else{
last=qs[ID-1].id;
}
}
for(int i=0;i<n;++i) if(!vis[ps[i].id]){
++e;
printf("%d%c",ps[i].id,e==n?'\n':' ');
}
return 0;
}

【计算几何】【凸包】Gym - 101164H - Pub crawl的更多相关文章

  1. gym 101164 H.Pub crawl 凸包

    题目链接:http://codeforces.com/gym/101164/attachments 题意:对于已知的 n 个二维坐标点,要求按照某种特定的连线方式将尽可能多的点连接(任意相邻的 3 个 ...

  2. 计算几何---凸包问题(Graham/Andrew Scan )

    概念 凸包(Convex Hull)是一个计算几何(图形学)中的概念.用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的.严谨的定义和相关概念参 ...

  3. 计算几何-凸包-toleft test

    toLeftTest toLeftTest是判断一个点是否在有向直线左侧的算法. 当点s位于向量pq左侧时,toLeftTest返回true.当点s位于向量pq右侧时,toLeftTest返回fals ...

  4. 计算几何-凸包算法 Python实现与Matlab动画演示

    凸包算法是计算几何中的最经典问题之一了.给定一个点集,计算其凸包.凸包是什么就不罗嗦了 本文给出了<计算几何——算法与应用>中一书所列凸包算法的Python实现和Matlab实现,并给出了 ...

  5. 【BZOJ-1069】最大土地面积 计算几何 + 凸包 + 旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2707  Solved: 1053[Submit][Sta ...

  6. uva 10652 Board Wrapping (计算几何-凸包)

    Problem B Board Wrapping Input: standard input Output: standard output Time Limit: 2 seconds The sma ...

  7. Codeforces 1045E. Ancient civilizations 构造 计算几何 凸包

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045E.html 4K码量构造题,CF血腥残暴! 题解 首先,如果所有点颜色相同,那么直接连个菊花搞定. ...

  8. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  9. POJ3348 Cows 计算几何 凸包

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3348 题意概括 求凸包面积(答案÷50) 题解 凸包裸题. 代码 #include <cstr ...

随机推荐

  1. Jquery checkbox 遍历

    checkbox 全选\全部取消 $("#ChkAll").click(function(){    $("#divContent input[type='checkbo ...

  2. vs调试 配置IISExpress允许局域网内部访问

    内网可访问后,本机不能使用localhost   1.找到IISExpress的配置文件,位于 <文档>/IISExpress/config文件夹下,打开applicationhost.c ...

  3. java===编译引用第三方文件的类(原创)

    http://blog.csdn.net/m53931422/article/details/42174609 http://blog.csdn.net/u012450329/article/deta ...

  4. #error This file was generated by a newer version of protoc

    pattern@pattern89:/raid0/workspace/houjun/caffe-ssd$ sudo make all -j8PROTOC src/caffe/proto/caffe.p ...

  5. ubuntu命令行操作mysql常用操作

    登陆mysql harvey@harvey-Virtual-Machine:~/ruby/mydiary$ mysql -u root -p Enter password: Welcome to th ...

  6. 关于时间日期的一些操作--java

    # 原创,转载请留言联系 1.获取当前时间 public static void main(String[] args) { Date d1 = new Date(); System.out.prin ...

  7. http请求数据的格式

    最近看了tinyhttpd的服务器代理,看了看http请求数据包的格式和内容 http请求报包含三个部分: 请求行 + 请求头 + 数据体 请求行包含三个内容 method + request-URI ...

  8. Java AQS学习

    参考原文: Java并发之AQS详解 <Java并发编程的艺术> AQS 概述 AQS简介 AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,它是用来 ...

  9. JAVA用POI读取和创建2003和2007版本Excel

    1.添加maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-o ...

  10. 走进 UnitTest for Xamarin.Forms

    之前讲了 Xamarin.Forms 的 UITest 走进 UITest for Xamarin.Forms 走进 Xamarin Test Recorder for Xamarin.Forms 但 ...