熬夜的惩罚

熬夜的惩罚
Problem:A
Time Limit:1000ms
Memory Limit:65535K
Description
卡迪亚得到你给他的答案,就蹦跶蹦跶地去下载游戏了,不过由于游戏太多,一直到晚上12点才下载好。看着这么多好玩的游戏,哪还有心情去睡觉啊,于是悄悄关上房门玩起了游戏。

玩着玩着,就到了凌晨5点,这下完蛋了,早上8点还有课呢!!! 于是赶紧倒下去睡觉了(玩了这么久游戏哪可能说睡着就睡着啊),果然,第二天早上上网课卡迪亚睡着了,更巧的是,还被他妈妈逮了个正着,妈妈斥责道:还睡觉?你是啥都会了吗?来,给你写一道题。

题目说:一个平面中有n个点,保证点不重合,任意三点不共线,并且这n个点构成的一定是凸边形,这些点按顺时针顺序从1到n编号。现在告诉你1到n每个点的坐标(xi) (yi)。如果有两个点p1,p2,其中p1=(x1,y1),p2=(x2,y2) ,定义这两点的特殊距离d(p1,p2)=|x1−x2|+|y1−y2|,现在再告诉你需要在这n个点中任意选择k(k≥3)个点,请你找出k个点构成的凸边形在特殊距离公式下的最大周长,其中周长C=d(p1,p2)+d(p2,p3)+…+d(pk,p1)。

为了惩罚你,妈妈让你把所有可能的k的结果都求出来,即求出所有k在[3~n]取值时的答案C。
注意:k个点构成的一定要是凸边形,且边不能够相交,边也必须是直线。下图中左边的图是正确的图,中间的图边相交了,右边的图边不是直线
在这里插入图片描述

以下这样的图形就是凸边形

在这里插入图片描述

以下这样的图形就不是凸边形
在这里插入图片描述

Input
第一行一个整数表示点的数量n (3≤n≤3⋅1e5)
之后n行,每行两个整数,分别表示第i个点的坐标xi,yi (−1e8≤xi,yi≤1e8)
ps:点集是凸的,所有点都是不同的,点是按顺时针顺序排列的,不会有三个共线点。
Output
共一行,分别输出k的取值从3到n时的的每一个结果,每个数之间有一个空格,最后一个数后没有空格。
Sample Input
4
2 4
4 3
3 0
1 3
Sample Output
12 14
Hint
k=3时最大的周长是选2 3 4点。C=4+5+3=12
k=4时最大的周长是选1 2 3 4点 C=3+4+5+2=14

#include <bits/stdc++.h>
using namespace std;
int x[300005];
int y[300005];
int main()
{
    int n;
    cin >> n;
    int max_x=-0x3f3f3f3f;
    int max_y=-0x3f3f3f3f;
    int min_x=0x3f3f3f3f;
    int min_y=0x3f3f3f3f;
    for(int i=1;i<=n;i++)
    {
        cin >> x[i] >> y[i];
        max_x=max(max_x,x[i]);
        max_y=max(max_y,y[i]);
        min_x=min(min_x,x[i]);
        min_y=min(min_y,y[i]);
    }
    int c=0;
    for(int i=1;i<=n;i++)
    {
        c=max(c,abs(x[i]-max_x)+abs(y[i]-max_y));
        c=max(c,abs(x[i]-max_x)+abs(y[i]-min_y));
        c=max(c,abs(x[i]-min_x)+abs(y[i]-max_y));
        c=max(c,abs(x[i]-min_x)+abs(y[i]-min_y));
    }
    cout << 2*c ;
    c=2*(max_x-min_x)+2*(max_y-min_y);
    for(int i=4;i<=n;i++)
    {
        cout << " " << c;
    }
    cout << endl ;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值