【题意】抽象模型后转化为:给定n个直线,ans+=C(x,4)*8,x为每个经过直线数>=4的点的直线数,不存在平行直线。

【算法】数学

【题解】

运用了一个很简单的道理:经过同一个点的线段互相相交。

O(n^3),枚举直线i和j相交,然后枚举后面直线判断是否过交点的条数x,将C(x,2)累加入答案。

O(n^2*log n),只要O(n^2)跑一边交点(不去重),排序,统计相同交点有几个就可以得知经过该交点的直线数了。

访问x次,则可由1+2+3+...+n-1=x求得n。

注意多关键字double排序。

注意eps=1e-6足矣。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define ll long long
  7. using namespace std;
  8. int read()
  9. {
  10. char c;int s=,t=;
  11. while(!isdigit(c=getchar()))if(c=='-')t=-;
  12. do{s=s*+c-'';}while(isdigit(c=getchar()));
  13. return s*t;
  14. }
  15. /*------------------------------------------------------------*/
  16. const int inf=0x3f3f3f3f,maxn=,maxN=;
  17. const double eps=1e-;
  18. struct cyc{double x,y;}anss[maxN];
  19. int n,x1[maxn],x2[maxn],y1_[maxn],y2[maxn],tot;
  20. double k[maxn],b[maxn];
  21. ll c[maxn],d[maxN];
  22. void insert(double x,double y){anss[++tot].x=x;anss[tot].y=y;}
  23. bool cmp(cyc a,cyc b){return fabs(a.x-b.x)>eps?a.x<b.x:a.y<b.y;}
  24. int main()
  25. {
  26. scanf("%d",&n);
  27. for(int i=;i<=n;i++){
  28. x1[i]=read(),y1_[i]=read(),x2[i]=read(),y2[i]=read();
  29. if(x2[i]-x1[i])k[i]=1.0*(y2[i]-y1_[i])/(x2[i]-x1[i]);
  30. b[i]=1.0*y1_[i]-k[i]*x1[i];
  31. }
  32. tot=;
  33. for(int i=;i<n;i++){
  34. for(int j=i+;j<=n;j++){
  35. if(x2[i]-x1[i]==){
  36. if(x2[j]-x1[j]==)continue;
  37. insert(x1[i],k[j]*x1[i]+b[j]);
  38. }else if(x2[j]-x1[j]==){
  39. insert(x1[j],k[i]*x1[j]+b[i]);
  40. }else{
  41. double X=(b[i]-b[j])/(k[j]-k[i]);
  42. double Y=k[i]*X+b[i];
  43. insert(X,Y);
  44. }
  45. }
  46. }
  47. sort(anss+,anss+tot+,cmp);
  48. c[]=;
  49. for(int i=;i<=n;i++)c[i]=c[i-]*i/(i-);
  50. ll number=;
  51. for(int i=;i<=n;i++){number+=i-;d[number]=i;}
  52. ll ans=,num=;
  53. anss[].x=anss[].y=-;
  54. for(int i=;i<=tot;i++)if(fabs(anss[i].x-anss[i-].x)<eps&&fabs(anss[i].y-anss[i-].y)<eps)num++;else{
  55. ans+=c[d[num]];num=;
  56. }
  57. ans+=c[d[num]];
  58. printf("%lld",ans*);
  59. return ;
  60. }

【STSRM13】木之本樱的更多相关文章

  1. 【STSRM13】绵津见

    [算法]扫描线:差分+树状数组 [题意]转化模型后:求每个矩形覆盖多少点和每个点被多少矩形覆盖.n<=10^5. [题解]经典的扫描线问题(二维偏序,二维数点). 数点问题 将所有询问离线并离散 ...

  2. 【STSRM13】花六游鸟小

    [题意]给定n个节点的树,每个节点有一个m位二进制数,数字可以随时按位取反,每个数位有一个价值,定义每个点的最大价值是从根到这个点路上的数字(可以取反)或起来的数字中,1有价值0无价值,加起来得到的最 ...

  3. SRM13

    由于种种原因,好像出了点锅……? 好在问题不是很大. 得分比我估的要低啊. 木之本樱 计算几何送分题 就是叫你求一共有多少组四线共点,O(n^4)暴力可以过初.枚举两条线,求出交点之后求有多少条直线过 ...

  4. jQuery基础与JavaScript与CSS交互-第五章

    目录 JavaScript框架种类及其优缺点 jQuery库 jQuery对象$ 掌握基本选择器 掌握过滤选择器 掌握表单选择器 RIA技术 常见的RIA技术 Ajax Sliverlight Fle ...

  5. 汕头市队赛 SRM1X T1

    木之本樱 背景 “西瓜是可以种在树上的!”——木之本樱 描述 空地上,一排排的西瓜树拔地而起. 魔法世界里,空地是无限大的.所有的树排成了n条直线,每条直线也是向左右两端无限延伸的. 由于自己姓木(之 ...

随机推荐

  1. MFC随笔记录——1

    这段时间用MFC做完了项目里的一个对图像处理(字迹匹配)的软件,通过项目的具体要求的一步一步的实现,我也学习到了很多以前困惑很久的问题,算是对自己的一个提高吧,把一些有技巧性的操作记在这里,给以后的自 ...

  2. L007- linux系统优化进阶课堂小节

    首先把这节课所讲的大概引锁一下,然后下面详细列举. 1.填加普通用户,通过sudo管理. 2.更改默认的SSH服务端口及禁止root用户远程连接. 3.定时自动更新服务器时间 4.关闭防火墙(ipta ...

  3. Java泛型的基本介绍与使用

    为什么要使用泛型? 在Java中增加泛型之前,泛型程序设计是用继承来实现的,例如ArrayList,只维护Object引用的数组: public class ArrayList{ private Ob ...

  4. Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

    作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...

  5. resetroot_169route_python2(用于ubuntu12.04和14.04,centos系列)

    #!/usr/bin/python import os import json import subprocess from cloudinit.sources.DataSourceConfigDri ...

  6. [leetcode-646-Maximum Length of Pair Chain]

    You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...

  7. highcharts图表插件初探

    转载请注明出处:http://www.cnblogs.com/liubei/p/highchartsOption.html HighCharts简介 Highcharts 是一个用纯JavaScrip ...

  8. JavaSE复习(七)Stream流和方法引用

    Stream流 全新的Stream概念,用于解决已有集合类库既有的弊端. 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们 ...

  9. JavaWeb 基于Session的用户登陆注销实现

    通过Session来存储用户的部分登陆信息来验证用户是否在线,这应该时最容易实现的一种Web端方案,本文以SSM(Spring.SpringMVC.myBatis)框架为载体,来具体实现这套登陆系统. ...

  10. python学习笔记-list的用法

    1.list的定义 list = [] list = [1,2,'a','b'](list中的元素不一定是一个类型) 2.list的操作 1)list.append(value) 2)list.ins ...