首页 > 其他分享 >P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包

P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包

时间:2024-03-20 19:44:36浏览次数:39  
标签:node P2742 int Fencing top 凸包 double y1 y2

原题链接

题解

这么优质的文章我写什么题解

好难解释必然性感觉像模拟??

code

#include<bits/stdc++.h>
using namespace std;
int q[100005]={0};
struct node
{
    double x,y;
}a[100005];

double dis(int b,int c)
{
    node i=a[b],j=a[c];
    return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
}

bool cmp(node b,node c)
{
    if(b.x!=c.x) return b.x<c.x;
    return b.y>c.y;//贪心地往小的圈
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y;
    }

    sort(a+1,a+n+1,cmp);

    q[1]=1;
    q[2]=2;
    int top=2;
    for(int i=3;i<=n;i++)//扫下边
    {
        while(top>1)
        {
            double x1=a[q[top]].x-a[q[top-1]].x,y1=a[q[top]].y-a[q[top-1]].y;
            double x2=a[i].x-a[q[top]].x,y2=a[i].y-a[q[top]].y;
            if(x1*y2-x2*y1<=0)top--;
            else break;
        }
        q[++top]=i;
    }

    int top1=top;
    q[++top]=n-1;
    for(int i=n-2;i>=1;i--)//扫上边
    {
        while(top>top1)
        {
            double x1=a[q[top]].x-a[q[top-1]].x,y1=a[q[top]].y-a[q[top-1]].y;
            double x2=a[i].x-a[q[top]].x,y2=a[i].y-a[q[top]].y;
            if(x1*y2-x2*y1<=0)top--;
            else break;
        }
        q[++top]=i;
    }
    double ans=0;
    for(int i=1;i<=top;i++)
    {
        //printf("%d:%d\n",i,q[i]);
        ans+=dis(q[i],q[i%top+1]);
    }

    printf("%.2lf",ans);
    return 0;
}

标签:node,P2742,int,Fencing,top,凸包,double,y1,y2
From: https://www.cnblogs.com/pure4knowledge/p/18085929

相关文章

  • P6810 「MCOI-02」Convex Hull 凸包 题解
    分析推式子题。\[ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\tau(\gcd(i,j))\]对于\((i,j)\),若\(k\)是\((i,j)\)的因子,则\(k\)一定整除\(i,j\),所以有:\[\\\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\sum\limits......
  • 关于一种维护凸包的根号数据结构
    本文介绍了笔者由一道题的根号做法受到启发,独自摸索出来的一个数据结构。由于笔者能力和精力有限,无法查找已有的资料,如果有哪位巨已经提出来了记得踩我一脚。介绍这个数据结构维护凸包,支持以下操作:\(O(\sqrt{n})\)在线加入/删除任意一条线段\(O(\sqrt{n}\log\sqrt{n})\)在......
  • 凸包学习笔记
    凸包一般通过证明或观察出斜率有单调性于是可以用凸包维护。P5155[USACO18DEC]BalanceBeamP题意:有长为\(n\)的序列,每次等概率向左右移动一格,也可以结束并获得当前位置上的值,求每个位置的最大期望收益。思路:完全不懂期望!首先有一个结论,在\([0,L]\)上的\(x\)处,每次等概率向......
  • 凸包
    1. LuoguP2742[USACO5.1]圈奶牛FencingtheCows/【模板】二维凸包上面是板子题Andrew 算法对所有点按坐标x为第一关键字、y为第二关键字排序。第1、第n两个点一定在凸包上。先顺序枚举所有点,求下凸包。用栈维护当前在凸包上的点:新点入栈前,总要判断该弹出哪些旧点。......
  • 二维凸包复习笔记
    Graham扫描法向量的叉乘:平行四边形面积,顺负逆正,x1y2-x2y11.确定1个凸包上的点:纵坐标最小(纵坐标相同时横坐标最小)的点2.极角排序3.单调栈维护凸包点击查看代码//二维凸包#include<bits/stdc++.h>usingnamespacestd;structt1{ doublex,y;}t[100005];ints[100......
  • Ybt 金牌导航 6.1.H. 时空旅行 / P5416 [CTSC2016] 时空旅行(线段树分治+凸包)
    题意简述初始有版本\(0\),其中仅包含点\(0\),且\(c_0\)给出,\(x_0=0\)。对于第\(i\)个版本,它依赖第\(fr_i\)个版本,而且会在父级版本的基础上进行以下两种操作之一:插入一个新点,并且会给出\(x_i\)和\(c_i\)。删除一个本就存在的点(不为\(0\))给出\(m\)次询问,每次给出......
  • 笔记重修计划一:斜率优化 dp & cdq 分治维护凸包(施工中)
    施工中,但是目前暂停施工。前言刷cdq分治的时候做到了这题,发现自己不是很懂这个东西,跑回去看自己几个月前写的斜率优化dp笔记,当时认为自己弄得很明白了,但现在看来简直就是皮毛,遂弄明白后写下此文,希望自己之后有更多启发时能继续充实这篇文章。若有不妥之处望指出。如果单调......
  • 计算离散点的边界 MATLAB计算多维凸包
    无论是进行回归、拟合还是深度学习,总要将总体数据集划分为训练样本集和测试样本集。然而,一般情况下,测试集位于训练集“所覆盖的范围之内”时(如下图所示,红色星号表示训练样本集所在位置,蓝色圆点表示测试样本集所在位置),测试效果较好,测试结果也更具合理性。但是如何验证测试集是否在......
  • 关于凸包位置关系的判断
    近日恰好和同学谈到多边形之间怎么判断相交关系,便写下这篇博文。由于非凸多边形的不确定性,这里就只谈论凸多边形间位置关系判断的优化。对于分别有\(n\)和\(m\)条边的非凸多边形可以枚举两个多边形的边判断线段是否相交,时间复杂度为\(O(mn)\)。凸多边形(以下简称凸包)也可以......
  • CF70D Professor's task 题解 & 动态凸包板子
    CF70DProfessor'stask题解前言此篇题解用的是\(Andrew\),不想看这种做法的可以绕道。题意动态凸包板子题。维护动态凸包。两种操作,加一个点或查询一个点是否在凸包内。题解首先你得会静态二维凸包。维护二维凸包的方法挺多的,比如什么\(Andrew\)算法,\(Jarvis\)算法还......