【题意】抽象模型后转化为:给定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足矣。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=,maxN=;
const double eps=1e-;
struct cyc{double x,y;}anss[maxN];
int n,x1[maxn],x2[maxn],y1_[maxn],y2[maxn],tot;
double k[maxn],b[maxn];
ll c[maxn],d[maxN];
void insert(double x,double y){anss[++tot].x=x;anss[tot].y=y;}
bool cmp(cyc a,cyc b){return fabs(a.x-b.x)>eps?a.x<b.x:a.y<b.y;}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
x1[i]=read(),y1_[i]=read(),x2[i]=read(),y2[i]=read();
if(x2[i]-x1[i])k[i]=1.0*(y2[i]-y1_[i])/(x2[i]-x1[i]);
b[i]=1.0*y1_[i]-k[i]*x1[i];
}
tot=;
for(int i=;i<n;i++){
for(int j=i+;j<=n;j++){
if(x2[i]-x1[i]==){
if(x2[j]-x1[j]==)continue;
insert(x1[i],k[j]*x1[i]+b[j]);
}else if(x2[j]-x1[j]==){
insert(x1[j],k[i]*x1[j]+b[i]);
}else{
double X=(b[i]-b[j])/(k[j]-k[i]);
double Y=k[i]*X+b[i];
insert(X,Y);
}
}
}
sort(anss+,anss+tot+,cmp);
c[]=;
for(int i=;i<=n;i++)c[i]=c[i-]*i/(i-);
ll number=;
for(int i=;i<=n;i++){number+=i-;d[number]=i;}
ll ans=,num=;
anss[].x=anss[].y=-;
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{
ans+=c[d[num]];num=;
}
ans+=c[d[num]];
printf("%lld",ans*);
return ;
}

【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. Linux用户态程序计时方式详解[转]

    转自: http://www.cnblogs.com/clover-toeic/p/3845210.html 前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确 ...

  2. Java检测端口的占用情况

    突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...

  3. svn建立主干和分支在分支上开发然后合并到主干

    我们以后打算用svn分支了,如何避免对新事物的恐惧心理呢? 领导: “我们需要慢慢适应,开始的时候我们先用一个项目练手,等熟悉了之后,再把每个项目都建上分支”

  4. MQTT在平台中的应用【本文摘自智车芯官网】

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联 ...

  5. PokeCats开发者日志(四)

      现在是PokeCats游戏开发的第八天的上午,感觉游戏做得差不多了,来写一下开发者日志吧!   (1)增加闯关模式,一共30关.   (2)更改了最后一关的主题,更换了背景,将树桩改为礼物盒.   ...

  6. Flink之状态之状态存储 state backends

    流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...

  7. 教你一步一步在linux中正确的安装Xcache加速php

    #第一步,下载Xcache wget http://xcache.lighttpd.net/pub/Releases/3.1.0/xcache-3.1.0.tar.gz #第一步非常简单,如果你下载不 ...

  8. Oracle中SQL语言介绍以及基本用法

    一.SQL语言支持如下类别命令 1.数据定义语言(DDL):CREATE(创建).ALTER(更改) 和 DROP(删除)命令 1.1  CREATE (创建表,表空间,用户, 索引, 视图, 同义词 ...

  9. 【python】time 和datetime类型转换,字符串型变量转成日期型变量

    s1='20120125';   6     s2='20120216';   7     a=time.strptime(s1,'%Y%m%d');   8     b=time.strptime( ...

  10. powershell入门教程-v0.3版

    powershell入门教程-v0.3版 来源 https://www.itsvse.com/thread-3650-1-1.html 参考 http://www.cnblogs.com/piapia ...