zoukankan      html  css  js  c++  java
  • 【魔改】hdu6325 多校赛3G xy排序凸包+llvector模板

    凸包算法前的预处理,可以极角排序,也可以按X,Y轴排序,

    极角排序需要找到角落里的一个点,Xy轴排序要跑两遍凸包

    而本题的要求只要一个上半凸包,并且有X轴从小到大以及字典序限制,完全符合xy排序,直接一个循环就过了

    坑点:我输出了整个数组的大小,然后完全无视了,wa了12发orz

    学会了cmd 的fc来比较文件,多校赛数据都是20M的orz

    #define _CRT_SECURE_NO_WARNINGS
    #include<cmath>
    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<cstring>
    #include<stack>
    #include<vector>
    #include<string.h>
    #include<queue>
    #include<string>
    #include<set>
    #include<time.h>
    using namespace std;
    #define rep(i,t,n)  for(int i =(t);i<=(n);++i)
    #define per(i,n,t)  for(int i =(n);i>=(t);--i)
    #define mmm(a,b) memset(a,b,sizeof(a))
    #define eps 1e-6
    #define pb push_back
    const int maxn = 2e5 + 10;
    const int inf = 1e7 + 5;//0x7fffffff;   //无限大
    const int MOD = 1013;
    typedef long long ll;
    
    
    
    struct V {
        ll x, y;
        int rk;
        //V() {}
        void sc() { scanf("%lld%lld", &x, &y); }
        V(ll a=0, ll b=0,int rk=0) : x(a), y(b),rk(rk) { }
        V operator+(V o) { return V(x + o.x, y + o.y); }
        V operator-(V o) { return V(x - o.x, y - o.y); }
        double L() { return sqrt(x * x + y * y); }
        V N() {
            double l = L();
            return V(x / l, y / l);
        }
        V rot(double th) { return V(x * cos(th) - y * sin(th), x * sin(th) + y * cos(th)); }
        V operator*(ll z) { return V(x * z, y * z); }
        ll operator*(V o) { return x * o.x + y * o.y; }
        ll operator|(V o) { return 1ll*x * o.y - 1ll*o.x * y; }
        bool operator ==(V o) { return x == o.x&&y == o.y; }
        void pr() { printf("%lld %lld
    ", x, y); }
    } p[maxn], P[maxn];
    
    
    
    int n, top, head;
    
    bool cmp(V A, V B)
    {
        if (A.x != B.x)return A.x < B.x;
        if (A.y != B.y)return A.y > B.y;
        return A.rk < B.rk;
    }
    
    
    
    void smain() {
        int t; cin >> t;
        while (t--) {
    
            cin >> n;
            rep(i, 1, n)
            { p[i].sc(); p[i].rk = i; }
            top = 0;
            sort(p + 1, p + 1 + n, cmp);
            P[1] = p[1], P[2] = p[2];
            top = 2;
            rep(i, 3, n)  {
                if (p[i] == P[top])continue;
                while ( top > 1 &&( (((p[i] - P[top]) | (P[top - 1] - P[top])) > 0 )||(((p[i] - P[top]) | (P[top - 1] - P[top]))== 0&&P[top].rk>p[i].rk)) )top--;
                P[++top] = p[i];
                
            }
            rep(i, 1, top) {
                i!=top?printf("%d ", P[i].rk): printf("%d
    ", P[i].rk);
            }
    
        }
        cin >> n;
    
    }
    #define ONLINE_JUDGE
    int main() {
        //ios::sync_with_stdio(false);
    #ifndef ONLINE_JUDGE
        FILE *myfile;
        myfile = freopen("C:\Users\acm-14\Desktop\test\G.in", "r", stdin);
        if (myfile == NULL)
            fprintf(stdout, "error on input freopen
    ");
        FILE *outfile;
        outfile= freopen("C:\Users\acm-14\Desktop\test\out.txt", "w", stdout);
        if (outfile == NULL)
        fprintf(stdout, "error on output freopen
    ");
        long _begin_time = clock();
    #endif
        smain();
    #ifndef ONLINE_JUDGE
        long _end_time = clock();
        printf("time = %ld ms.", _end_time - _begin_time);
    #endif
        return 0;
    }
    /*
    2
    3
    0 0
    1 0
    2 0
    4
    0 0
    3 0
    2 0
    5 0
    
    5
    0 0
    1 3
    2 1
    4 4
    5 0
    
    //1 2 4 5
    */
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    git使用流程
    php5.3.*编译出现make: *** [ext/gd/libgd/gd_compat.lo] Error 1 解决方法 [转]
    linux用户和组的操作,vi编辑器的使用
    linux目录介绍
    linux和windows分区原理
    linux配置网络,配置lmap
    linux常用操作命令
    mysql数据库编程,内置函数,存储过程(循环插入)
    msql数据库触发器和连接mysql常用函数
    mysql数据库增加删除跟新,关联数据
  • 原文地址:https://www.cnblogs.com/SuuT/p/9395952.html
Copyright © 2011-2022 走看看