【STSRM13】木之本樱
【题意】抽象模型后转化为:给定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】木之本樱的更多相关文章
- 【STSRM13】绵津见
[算法]扫描线:差分+树状数组 [题意]转化模型后:求每个矩形覆盖多少点和每个点被多少矩形覆盖.n<=10^5. [题解]经典的扫描线问题(二维偏序,二维数点). 数点问题 将所有询问离线并离散 ...
- 【STSRM13】花六游鸟小
[题意]给定n个节点的树,每个节点有一个m位二进制数,数字可以随时按位取反,每个数位有一个价值,定义每个点的最大价值是从根到这个点路上的数字(可以取反)或起来的数字中,1有价值0无价值,加起来得到的最 ...
- SRM13
由于种种原因,好像出了点锅……? 好在问题不是很大. 得分比我估的要低啊. 木之本樱 计算几何送分题 就是叫你求一共有多少组四线共点,O(n^4)暴力可以过初.枚举两条线,求出交点之后求有多少条直线过 ...
- jQuery基础与JavaScript与CSS交互-第五章
目录 JavaScript框架种类及其优缺点 jQuery库 jQuery对象$ 掌握基本选择器 掌握过滤选择器 掌握表单选择器 RIA技术 常见的RIA技术 Ajax Sliverlight Fle ...
- 汕头市队赛 SRM1X T1
木之本樱 背景 “西瓜是可以种在树上的!”——木之本樱 描述 空地上,一排排的西瓜树拔地而起. 魔法世界里,空地是无限大的.所有的树排成了n条直线,每条直线也是向左右两端无限延伸的. 由于自己姓木(之 ...
随机推荐
- MFC随笔记录——1
这段时间用MFC做完了项目里的一个对图像处理(字迹匹配)的软件,通过项目的具体要求的一步一步的实现,我也学习到了很多以前困惑很久的问题,算是对自己的一个提高吧,把一些有技巧性的操作记在这里,给以后的自 ...
- L007- linux系统优化进阶课堂小节
首先把这节课所讲的大概引锁一下,然后下面详细列举. 1.填加普通用户,通过sudo管理. 2.更改默认的SSH服务端口及禁止root用户远程连接. 3.定时自动更新服务器时间 4.关闭防火墙(ipta ...
- Java泛型的基本介绍与使用
为什么要使用泛型? 在Java中增加泛型之前,泛型程序设计是用继承来实现的,例如ArrayList,只维护Object引用的数组: public class ArrayList{ private Ob ...
- Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...
- resetroot_169route_python2(用于ubuntu12.04和14.04,centos系列)
#!/usr/bin/python import os import json import subprocess from cloudinit.sources.DataSourceConfigDri ...
- [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 ...
- highcharts图表插件初探
转载请注明出处:http://www.cnblogs.com/liubei/p/highchartsOption.html HighCharts简介 Highcharts 是一个用纯JavaScrip ...
- JavaSE复习(七)Stream流和方法引用
Stream流 全新的Stream概念,用于解决已有集合类库既有的弊端. 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们 ...
- JavaWeb 基于Session的用户登陆注销实现
通过Session来存储用户的部分登陆信息来验证用户是否在线,这应该时最容易实现的一种Web端方案,本文以SSM(Spring.SpringMVC.myBatis)框架为载体,来具体实现这套登陆系统. ...
- python学习笔记-list的用法
1.list的定义 list = [] list = [1,2,'a','b'](list中的元素不一定是一个类型) 2.list的操作 1)list.append(value) 2)list.ins ...