zoukankan      html  css  js  c++  java
  • Jzoj4894 SJR的直线

    给你n条直线,每条直线的方程为Aix+Biy+Ci=0,求这些直线相交组成了多少个三角形

    注意,没有三条直线交于一点

    十分好做,我们将所有直线按照斜率排序就好了

    对于所有的平行线,我们考虑他们对答案的影响分别是什么

    假设有k条直线斜率相同,那么答案就要减去C(k,2)*(n-k)+C(k,3)

    注意排序的时候要将斜率算出来而不是用乘法比较

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define L long long
    #define M 1000000007
    using namespace std;
    struct Line{ L A,B,C; } s[300010];
    inline bool c1(Line a,Line b){ 
    	double k1=a.B?(double)-a.A/a.B:1e100;
    	double k2=b.B?(double)-b.A/b.B:1e100;
    	return k1<k2;
    }
    inline L c2(L n){ return (n*(n-1)>>1)%M; }
    inline L c3(L n){ return (n*(n-1)*(n-2)/6)%M; }
    int n,c[300010],t=0; L A;
    int main(){
    	freopen("trokuti.in","r",stdin);
    	freopen("trokuti.out","w",stdout);
    	scanf("%d",&n); A=c3(n);
    	for(int i=1;i<=n;++i) 
    		scanf("%lld%lld%lld",&s[i].A,&s[i].B,&s[i].C);
    	sort(s+1,s+1+n,c1);
    	for(int i=1,j=1;i<=n;){
    		for(;j<=n&&s[j].A*s[i].B==s[j].B*s[i].A;++j);
    		c[++t]=j-i; i=j;
    	}
    	for(int i=1;i<=t;++i)
    		A=(A+M-(c2(c[i])*(n-c[i])%M)-c3(c[i])+M)%M;
    	printf("%d
    ",A);
    }

  • 相关阅读:
    119. Pascal's Triangle II
    118. Pascal's Triangle
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    108. Convert Sorted Array to Binary Search Tree
    88. Merge Sorted Array
    83. Remove Duplicates from Sorted List
    70. Climbing Stairs
    陌陌面试经历
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477249.html
Copyright © 2011-2022 走看看