zoukankan      html  css  js  c++  java
  • HDU2297 Run

    以位置为横坐标,速度为纵坐标,则高处的点总会跑到低处的点前面。

    如图B追上A的时间就是横坐标差除以纵坐标差,也就是说斜率的绝对值越大,追上的越快。

    那么C就不会比B先追上A,B有机会保持一段时间的第一。同理C会在未来追上B,而保持一段时间第一。

    由此看来,统计凸包上x最大点和y最大点之间点的个数即得答案。对于多点共线的情况,只计一次,在求凸包的时候就可以处理掉了。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<math.h>
     5 #include<algorithm>
     6 using namespace std;
     7 typedef __int64 LL;
     8 const int maxn = 111111;
     9 typedef struct{LL x, y;}Point;
    10 inline LL det(LL x1, LL y1, LL x2, LL y2)
    11 {return x1 * y2 - x2 * y1;}
    12 LL cross(Point a, Point b, Point c)
    13 {return det(b.x -a.x, b.y - a.y, c.x - a.x, c.y - a.y);}
    14 int CompG(const void *a, const void *b)
    15 {
    16     if((*(Point*)a).y - (*(Point*)b).y)
    17         return (*(Point*)a).x - (*(Point*)b).x;
    18     return (*(Point*)a).y - (*(Point*)b).y;
    19 }
    20 LL Graham(Point p[], Point res[], LL n, LL &top)
    21 {
    22     LL len, i;
    23     top = 1;
    24     qsort(p, n, sizeof(Point), CompG);
    25     res[0] = p[0], res[1] = p[1];
    26     for(i = 2; i < n; ++ i)
    27     {
    28         while(top && cross(res[top], res[top - 1], p[i]) <= 0)
    29             -- top;
    30         res[++ top] = p[i];
    31     }
    32     len = top;
    33     res[++ top] = p[n - 2];
    34     for(i = n - 3; i >= 0; -- i)
    35     {
    36         while(top != len && cross(res[top], res[top - 1], p[i]) <= 0)
    37             -- top;
    38         res[++ top] = p[i];
    39     }
    40     return top;
    41 }
    42 Point p[maxn], res[maxn];
    43 LL n, m;
    44 int main()
    45 {
    46     int t, i, j, k, cnt;
    47     LL maxx, maxy;
    48     for(scanf("%d", &t); t -- ; )
    49     {
    50         scanf("%I64d", &n);
    51         for(i = 0; i < n; ++ i)
    52             scanf("%I64d%I64d", &p[i].x, &p[i].y);
    53         p[n] = p[0];
    54         Graham(p, res, n, m);
    55         for(i = maxx = maxy = 0; i < m; ++ i)
    56         {
    57             if(res[i].x > res[maxx].x) maxx = i;
    58             if(res[i].y > res[maxy].y) maxy = i;
    59         }
    60         printf("%I64d\n", (maxx - maxy + n) % n + 1);
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    zookeeper 分布式锁
    mysql linux 安装
    分布式配置中心Apollo
    分布式任务调度平台xxl-job
    Java并发编程笔记之ThreadLocalRandom源码分析
    Java并发编程笔记之ThreadLocal源码分析
    SpringCloud实战10-Sleuth
    SpringCloud实战9-Stream消息驱动
    SpringCloud实战8-Bus消息总线
    SpringCloud实战7-Config分布式配置管理
  • 原文地址:https://www.cnblogs.com/CSGrandeur/p/2678154.html
Copyright © 2011-2022 走看看