• [BZOJ4246]两个人的星座(计算几何)


    4246: 两个人的星座

    Time Limit: 40 Sec  Memory Limit: 256 MB
    Submit: 101  Solved: 55
    [Submit][Status][Discuss]

    Description

    JOI酱和IOI酱是好朋友。某天,JOI酱与IOI酱决定去山上的某个展望台进行天体观测。
    从展望台上可以观测到N颗星星,编号为1...N。每颗星星的颜色为红色、蓝色、黄色中的一种。
    在展望台上观测到的星星可以用坐标系上的点来表示。在坐标系上,星i(1<=i<=N)对应的点为Pi(Xi,Yi)。坐标系上的点两两不同,且不存在三点共线。
    JOI酱和IOI酱想要设立一个叫做“JOIOI座”的星座。首先。两个人决定使用红色、蓝色、黄色三种颜色的星各一个构成的三角形。他们将这样的三角形称作“好三角形”。
    两人将满足以下条件的好三角形无序二元组作为JOIOI座的候补:
    两个三角形没有公共点(包括内部和边界)。换言之,两个三角形之间既不相交,也不存在某个三角形包含另一个三角形。
     
    JOI酱和IOI酱想知道构成JOIOI座的候补一共有多少种方案。
    注意如果构成三角形的6个点一样但是构成三角形的方式不同,算作不同的方案。
    现在给出展望台上能观测到的星星的信息,请求出构成JOIOI座的候补一共有多少种方案

    Input

    第一行一个整数N,代表展望台上能观测到的星星的数量。
    接下来N行,第i行(1<=i<=N)有三个空格分隔的整数Xi,Yi,Ci,表示星i的坐标为Pi(Xi,Yi),Ci表示星i的颜色,其中0代表红色,1代表蓝色,2代表黄色。

    Output

    输出一行一个整数,表示JOIOI座候补的方案数。

    Sample Input

    7
    0 0 0
    2 0 1
    1 2 2
    -2 1 0
    -2 -3 0
    0 -2 1
    2 -2 2

    Sample Output

    4

    HINT

    样例中,JOIOI的候补有以下四种方案:

     

    6<=N<=3000

    -10^5<=Xi<=10^5(1<=i<=N)

    -10^5<=Yi<=10^5(1<=i<=N)

    0<=Ci<=2(1<=i<=N)

    每种颜色的星至少存在一个

    Pi≠Pj(1<=i<j<=N)

    Pi,Pj,Pk不共线(1<=i<j<k<=N)

    请注意你的常数

    Source

    [Submit][Status][Discuss]

    相离则显然能被公切线分割,枚举+极交排序即可。

    https://blog.csdn.net/lych_cys/article/details/51000549

    排序不要写cmp,写到结构体里去,记得传变参!

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define rep(i,l,r) for (int i=l; i<=r; i++)
     6 #define ll long long
     7 using namespace std;
     8 
     9 const int N=3030;
    10 const double Pi=acos(-1.);
    11 int n,s,c[2][3],bl[N];
    12 struct P{
    13     int x,y,c,id; double k;
    14     bool operator < ( const P &b ) const { return k < b.k; }
    15 }p[N];
    16 
    17 int main(){
    18     scanf("%d",&n);
    19     rep(i,1,n) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].c),p[i].id=i;
    20     P o; ll tmp,ans=0;
    21     rep(i,1,n){
    22         rep(j,1,n) if (p[j].id==i) { s=j; break; }
    23         o=p[s]; int k=o.c;
    24         rep(j,1,n){
    25             p[j].k=(p[j].id!=i) ? atan2(p[j].y-o.y,p[j].x-o.x) : 1e9;
    26             if (p[j].k<=0) p[j].k+=Pi;
    27         }
    28         sort(p+1,p+n+1); memset(c,0,sizeof(c));
    29         rep(j,1,n-1)
    30             if (p[j].y<o.y || (p[j].y==o.y && p[j].x>o.x))
    31                 c[bl[j]=0][p[j].c]++; else c[bl[j]=1][p[j].c]++;
    32         rep(j,1,n-1){
    33             c[bl[j]][p[j].c]--; tmp=1;
    34             if (k) tmp*=c[0][0]; if (p[j].c) tmp*=c[1][0];
    35             if (k^1) tmp*=c[0][1]; if (p[j].c^1) tmp*=c[1][1];
    36             if (k^2) tmp*=c[0][2]; if (p[j].c^2) tmp*=c[1][2];
    37             ans+=tmp; tmp=1;
    38             if (k) tmp*=c[1][0]; if (p[j].c) tmp*=c[0][0];
    39             if (k^1) tmp*=c[1][1]; if (p[j].c^1) tmp*=c[0][1];
    40             if (k^2) tmp*=c[1][2]; if (p[j].c^2) tmp*=c[0][2];
    41             ans+=tmp; c[bl[j]^=1][p[j].c]++;
    42         }
    43     }
    44     printf("%lld
    ",ans>>2);
    45     return 0;
    46 }
  • 相关阅读:
    CodeCraft-19 and Codeforces Round #537 (Div. 2) C. Creative Snap
    51nod 1007正整数分组(01背包变形)
    51nod 1007正整数分组(01背包变形)
    Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array
    Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array
    小a与星际探索
    小a与星际探索
    poj3764
    心理博弈
    4级
  • 原文地址:https://www.cnblogs.com/HocRiser/p/8811268.html
Copyright © 2020-2023  润新知