【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条直线,每条直线也是向左右两端无限延伸的. 由于自己姓木(之 ...
随机推荐
- ABP官方文档
https://aspnetboilerplate.com/Pages/Documents/Introduction
- ProxySQL初体验
Preface As we all know,it's a common sense that separate reading and writing operations can ...
- 「日常训练」「小专题·USACO」 Broken Necklace(1-2)
题意 圆形链条,打断一处可以形成一条链.问在哪个地方开始打断,能够形成最大的连续颜色(白色视作同样的颜色)? 分析 说起来很高级,但是我们实际上并不需要穷举打断的地方,只需要把串重复三回啊三回.然后从 ...
- 简明Python3教程 1.介绍
Python是少有的几种既强大又简单的编程语言.你将惊喜地发现通过使用Python即可轻松专注于解决问题而非和你所用的语言格式与结构. 下面是Python的官方介绍: Python is an eas ...
- ArcGIS10.2中文版安装和破解教程
http://jingyan.baidu.com/article/e73e26c0cb5c1324adb6a791.html
- PAT 甲级 1015 Reversible Primes
https://pintia.cn/problem-sets/994805342720868352/problems/994805495863296000 A reversible prime in ...
- springMVC js等文件找不到解决方法
<mvc:resources mapping="/javascript/**" location="/static_resources/javascript/&qu ...
- WEB-INF目录
背景: 在项目中,使用 "${pageContext.request.contextPath}/image/01.jpg"获取不到该图片.在浏览器中直接输入地址也找不到,报错404 ...
- java 自定义序列化
pom.xml 导包 创建自己的序列化类,继承 com.fasterxml.jackson.databind.JsonSerializer<T> 抽象类 重写 serialize() 方法 ...
- oracle分区技术提高查询效率
概述: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件 ...