# 挑战程序竞赛系列（91）：3.6凸包（2）

## 挑战程序竞赛系列（91）：3.6凸包（2）

```import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{

String INPUT = "./data/judge/201709/P1113.txt";

public static void main(String[] args) throws IOException {
new Main().run();
}

static final int MAX_N = 1000 + 16;
static final double PI = Math.acos(-1.0);

class P implements Comparable<P>{
int x;
int y;

P(int x, int y){
this.x = x;
this.y = y;
}

P sub(P a) {
return new P(x - a.x, y - a.y);
}

int det(P a) {
return x * a.y - y * a.x;
}

int dot(P a) {
return x * a.x + y * a.y;
}

@Override
public int compareTo(P o) {
return this.x != o.x ? this.x - o.x : this.y - o.y;
}
}

int N, L;
P[] ps;

double dist(P a, P b) {
return Math.sqrt(a.sub(b).dot(a.sub(b)));
}

P[] convexHull() {

Arrays.sort(ps);
P[] qs = new P[N * 2];
int k = 0;
for (int i = 0; i < N; qs[k++] = ps[i++]) {
while (k > 1 && qs[k - 1].sub(qs[k - 2]).det(ps[i].sub(qs[k - 1])) <= 0) k --;
}

for (int i = N - 2, t = k; i >= 0; qs[k++] = ps[i--]) {
while (k > t && qs[k - 1].sub(qs[k - 2]).det(ps[i].sub(qs[k - 1])) <= 0) k --;
}

P[] res = new P[k - 1];
System.arraycopy(qs, 0, res, 0, k - 1);
return res;
}

void solve() {
P[] qs = convexHull();
double res = 0;
int n = qs.length;
for (int i = 0; i < n; ++i) {
res += dist(qs[i], qs[(i + 1) % n]);
}

out.printf("%.0f\n", 2 * PI * L + res);
}

N = ni();
L = ni();

ps = new P[N];
for (int i = 0; i < N; ++i) {
ps[i] = new P(ni(), ni());
}

solve();
}

FastScanner in;
PrintWriter out;

void run() throws IOException {
boolean oj;
try {
oj = ! System.getProperty("user.dir").equals("F:\\java_workspace\\leetcode");
} catch (Exception e) {
oj = System.getProperty("ONLINE_JUDGE") != null;
}

InputStream is = oj ? System.in : new FileInputStream(new File(INPUT));
in = new FastScanner(is);
out = new PrintWriter(System.out);
long s = System.currentTimeMillis();
out.flush();
if (!oj){
System.out.println("[" + (System.currentTimeMillis() - s) + "ms]");
}
}

public boolean more(){
return in.hasNext();
}

public int ni(){
return in.nextInt();
}

public long nl(){
return in.nextLong();
}

public double nd(){
return in.nextDouble();
}

public String ns(){
return in.nextString();
}

public char nc(){
return in.nextChar();
}

class FastScanner {
StringTokenizer st;
boolean hasNext;

public FastScanner(InputStream is) throws IOException {
hasNext = true;
}

public String nextToken() {
while (st == null || !st.hasMoreTokens()) {
try {
} catch (Exception e) {
hasNext = false;
return "##";
}
}
return st.nextToken();
}

String next = null;
public boolean hasNext(){
next = nextToken();
return hasNext;
}

public int nextInt() {
if (next == null){
hasNext();
}
String more = next;
next = null;
return Integer.parseInt(more);
}

public long nextLong() {
if (next == null){
hasNext();
}
String more = next;
next = null;
return Long.parseLong(more);
}

public double nextDouble() {
if (next == null){
hasNext();
}
String more = next;
next = null;
return Double.parseDouble(more);
}

public String nextString(){
if (next == null){
hasNext();
}
String more = next;
next = null;
return more;
}

public char nextChar(){
if (next == null){
hasNext();
}
String more = next;
next = null;
return more.charAt(0);
}
}
}```

0 条评论

• ### 挑战程序竞赛系列（94）：3.6凸包（5）

挑战程序竞赛系列（94）：3.6凸包（5） 传送门：POJ 2079: Triangle 题意： 求三个点构成的最大三角形面积。 思路： 可以证明，三点构...

• ### 挑战程序竞赛系列（90）：3.6凸包（1）

挑战程序竞赛系列（90）：3.6凸包（1） 传送门：POJ 2187: Beauty Contest 题意： 平面上有N个牧场。i号牧场的位置在格点(xi,y...

• ### 挑战程序竞赛系列（57）：4.6数列上的分治法

版权声明：本文为博主原创文章，未经博主允许不得转载。 https://blog.csdn.n...

• ### 挑战程序竞赛系列（94）：3.6凸包（5）

挑战程序竞赛系列（94）：3.6凸包（5） 传送门：POJ 2079: Triangle 题意： 求三个点构成的最大三角形面积。 思路： 可以证明，三点构...

• ### 挑战程序竞赛系列（90）：3.6凸包（1）

挑战程序竞赛系列（90）：3.6凸包（1） 传送门：POJ 2187: Beauty Contest 题意： 平面上有N个牧场。i号牧场的位置在格点(xi,y...

• ### as3中颜色矩阵滤镜ColorMatrixFilter的使用

上面的例子，也是游戏开发中比较常用的功能，与“怪物”战斗后，将其“灰”掉。这其中最重要的还是对AS3颜色矩阵滤镜(ColorMatrixFilter)的使用。

• ### 算法学习之栈与队列

Stack<E> void push(E) //入栈 E pop() //出栈 E peek() //查看 int getSize() //长度 bool...

• ### 挑战程序竞赛系列（41）：4.1中国剩余定理

版权声明：本文为博主原创文章，未经博主允许不得转载。 https://blog.csdn.n...

• ### POJ 刷题系列：3299. Humidex

POJ 刷题系列：3299. Humidex 传送门：POJ 3299. Humidex 题意： 给定T， D， H中的任意两个数，求另外一个。 思路： ...