首页 > 其他分享 >tzoj1471 wall(凸包模板题)

tzoj1471 wall(凸包模板题)

时间:2023-08-12 10:35:54浏览次数:39  
标签:node return wall double tot 凸包 int tzoj1471

题目大意

      n个点构成的城堡,给出每个点的坐标。若要修建距离城堡最近距离为L的城墙,问城墙的最短长度。

      凸包模板题,用Andrew算法求出凸包然后加上半径为L的圆的周长即可。

Andrew算法

      首先对所有点按照y大小进行升序排序,如果y相同就按照x大小升序排序。

构造上凸包

      前两个点直接入栈。随后遍历其他点,利用叉积判断每个点能否于它的前两个点构成凸多边形。

      如果是就入栈。

      如果不是就回溯,不断地删除最后一个入栈的点,直到栈中只剩下一个点或者栈顶的两个点能与当前的点构成凸多边形。

构造下凸包

      与构造上凸包同理。回溯时要注意不能删除上凸包的点。

代码

 1 #include <bits/stdc++.h>
 2 #define IO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
 3 using namespace std;
 4 
 5 const int N = 1001;
 6 int n, tot;
 7 struct node
 8 {
 9     double x, y;
10 } a[N], p[N];
11 
12 double dis(node A,node B)
13 {
14     return sqrt((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
15 }
16  
17 double cross(node A,node B,node C)
18 {
19     return (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
20 }
21 bool cmp(node A,node B)
22 {
23     if(A.y!=B.y)
24         return A.y < B.y;
25     return A.x < B.x;
26 }
27 void Andrew(double l)
28 {
29     sort(a + 1, a + n + 1, cmp);
30     tot = 0;
31     for (int i = 1; i <= n; i++)
32     {
33         while(tot>1&&cross(p[tot-1],p[tot],a[i])<=0)
34             tot--;
35         p[++tot] = a[i];
36     }
37     double ans = 0;
38     int temp = tot;
39     for (int i = n - 1; i >= 1; i--)
40     {
41         while(tot>temp&&cross(p[tot-1],p[tot],a[i])<=0)
42             tot--;
43         p[++tot] = a[i];
44     }
45     for (int i = 1; i < tot;i++)
46     {
47         ans += dis(p[i], p[i + 1]);
48     }
49     cout << int(ans + 2.0 * acos(-1) * l + 0.5) << endl;
50 }
51 signed main()
52 {
53     IO;
54     double l;
55     cin >> n >> l;
56     for (int i = 1; i <= n;i++)
57         cin >> a[i].x >> a[i].y;
58     Andrew(l);
59     return 0;
60 }

 

标签:node,return,wall,double,tot,凸包,int,tzoj1471
From: https://www.cnblogs.com/yosuganosora/p/17624448.html

相关文章

  • 七月学习之Firewalld基本介绍
    1、Firewalld基本介绍1.1、什么是Firewalld在CentOS7系统中集成了多款防火墙管理工具,默认启动的是firewalld(动态防火墙管理器)Firewalld支持CLI及GUI的两种管理方式对于接触linux较早的人员对iptables比较的熟悉由于iptables的规则比较麻烦,并且网络有一定要求,所以学习成本较高......
  • 凸包练习
    凸包练习本文主要是对遇到的进阶凸包问题进行总结目录凸包练习1.JOISC2012Day2T2「星座」2.atcoderHoles3.动态凸包4.合金1.JOISC2012Day2T2「星座」直接看,完全没思路,看题解,三角剖分什么鬼,于是建议去CF1045E先看看类似题解干脆单独写一篇博客吧2.atcoderHoles......
  • [学习笔记] 凸包
    凸包由于\(Andrew\)算法较快,所以主要介绍\(Andrew\)的实现方式我们把输入按照\(x\)为第一关键字,\(y\)为第二关键字进行从小到大排序,保证了\(1\)和\(n\)两个端点把凸包分成了两个部分(称为凸壳),从\(1\)遍历到\(n\)再从\(n\)遍历到\(1\),把遍历到的点压入栈,使......
  • Linux防火墙firewalld&iptables(2)iptables开放指定端口开放指定端口
    一、CentOs6iptables基本操作#chkconfig--list|grepiptables 查看防火墙的服务#chkconfigiptablesoff 永久关闭防火墙#chkconfigiptableson 永久开启防火墙#servicestatusiptables 查看防火墙状态#servicestartiptables 启动防火墙#servicestopiptab......
  • Linux:防火墙iptables与firewalld的启停
    Linux关闭防火墙firewall和iptables命令_永久关闭iptables防火墙_红烧柯基的博客-CSDN博客Linux防火墙——iptables以及firewalld的使用介绍_树下一少年的博客-CSDN博客干货!Linux防火墙配置(iptables和firewalld)_数据包_规则_进行 iptables与firewalld1、状态syste......
  • [转]Linux下系统防火墙的发展历程和怎样学好防火墙(iptalbes和firewalld)
    原文地址:Linux下系统防火墙的发展历程和怎样学好防火墙(iptalbes和firewalld)-Repetition_Maximum-博客园有关firewalld和iptables详细使用的文章iptables详解firewalld详解=====================================华丽的分割线===================================== 1.......
  • 开启firewalld或iptables的日志记录
    文件名:ip_fire.sh内容:#!/bin/bash#iptablesiptables_run(){#修改日志文件grep-e"^kern.*"/etc/rsyslog.confflag_k=$?if[$flag_k-eq0]thenecho"rsyslog日志指定文件已存在"elsesed-i'/#kern.*......
  • iptables和firewalld开通策略日志
    我的iptables中有这个规则:iptables-AINPUT-s192.168.11.0/24-jLOG我的问题是:iptables日志文件在哪里,我该如何更改?这些日志由内核生成,因此它们将转到接收内核日志的文件: /var/log/kern.log 。如果要将这些日志重定向到其他文件,则无法通过iptables完成。它可以在调......
  • firewalld开启防火墙日志记录和指定日志记录位置
    CentOS操作系统中Firewalld防火墙默认是不记录日志的,如果服务器性能允许,可以通过修改配置文件,使Firewalld防火墙记录日志,这样我们可以通过防火墙记录的日志,查询过滤拒绝的非法ip,把这些ip放入到黑名单中。修改配置文件:/etc/firewalld/firewalld.conf 修改为:LogDenied=all......
  • 第九章 wirewalld防火墙
    1、CentOS7.x中默认使用的防火墙是firewalld,在centos6中防火墙叫做iptablesfirewalld增加了区域的概念,所谓区域是指,firewalld预先准备了几套防火墙策略的集合,类似于策略的模板,用户可以根据需求选择区域。2、常见区域及相应策略规则如下:区域默认策略trusted 允许所有数据......