木之本樱

背景

“西瓜是可以种在树上的!”——木之本樱

描述

空地上,一排排的西瓜树拔地而起。

魔法世界里,空地是无限大的。所有的树排成了n条直线,每条直线也是向左右两端无限延伸的。

由于自己姓木(之本)小樱忽然想知道,这些直线能够组成多少个汉字“木”。

我们这样定义一个“木”字:从已有的直线中任取4条,并将其中两条截为射线。若两射线端点为同一点,且两直线均过该端点。对其中一条直线而言,两条射线在同一侧,对另一条直线而言两条射线在异侧,则此时组成一个“木”字。认为两个“木”字相同当且仅当其所取的射线及直线均相同。

比如直线组成这样的图像:

答案为8,8个“木”依次为

输入格式

第一行一个整数n,表示直线的数量。

接下来n行,每行4个整数x1,y1,x2,y2,表示一条过(x1,y1),(x2,y2)直线。保证两个坐标不相同。

输出格式

一个整数,表示“木”字的数量。

样例输入1

4

0 0 1 1

0 0 1 2

0 0 1 3

0 0 1 4

样例输出1

8

样例输入2

6

0 0 1 1

0 0 1 2

0 0 1 3

0 0 1 4

0 0 1 5

0 1 1 1

样例输出2

40

数据范围与约定

对于初(10组数据):1<=n<=50

对于续(10组数据):1<=n<=200

对于终(5组数据):1<=n<=800

对于所有数据:0<=|x1|,|y1|,|x2|,|y2|<= 20000

样例解释

样例1原图为:

可以发现它与题目举例本质相同。

————————————————————————

这道题求出所有的交点 记录每个交点的个数

利用一元二次方程可以求出答案QAQ

精度很重要 要数据的话私我

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int M=1e3+,inf=0x3f3f3f3f;
LL ans,sum;
bool pd(double a,double b){return fabs(a-b)<1e-;}
int n;
double a[M],b[M];
struct node{double x1,y1,x2,y2;}e[M];
int cnt;
struct pos{double x,y;}q[M*M];
bool cmp(pos a,pos b){return !pd(a.x,b.x)?a.x<b.x:a.y<b.y;}
void prepare(int k){
if(pd(e[k].x1,e[k].x2)){a[k]=b[k]=inf; return ;}
a[k]=(e[k].y1-e[k].y2)/(e[k].x1-e[k].x2);
b[k]=e[k].y1-a[k]*e[k].x1;
}
void calc(int k1,int k2,double& x,double& y){
if(a[k1]==inf&&b[k1]==inf){
x=e[k1].x1;
y=a[k2]*x+b[k2];
}
else if(a[k2]==inf&&b[k2]==inf){
x=e[k2].x1;
y=a[k1]*x+b[k1];
}
else{
x=(b[k2]-b[k1])/(a[k1]-a[k2]);
y=a[k1]*x+b[k1];
}
}
int main()
{
//freopen("sakura.in","r",stdin);
//freopen("sakura.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf %lf %lf %lf",&e[i].x1,&e[i].y1,&e[i].x2,&e[i].y2);
prepare(i);
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++)if(!pd(a[i],a[j])){
double x,y;
calc(i,j,x,y);
q[++cnt]=(pos){x,y};
}
}
sort(q+,q++cnt,cmp);
sum=;
for(int i=;i<=cnt;i++){
if(pd(q[i].x,q[i-].x)&&pd(q[i].y,q[i-].y)) sum++;
if(!pd(q[i].x,q[i-].x)||!pd(q[i].y,q[i-].y)||i==cnt){
LL now=(+sqrt(+*sum))/;
if(now>=) ans=ans+now*(now-)*(now-)*(now-)/*;
sum=;
}
}
printf("%lld\n",ans);
return ;
}

当然还有随机化算法 在取模意义下表示分数QAQ 就不用担心精度问题辣

不过扩欧比费马小快 所以就改了一波扩欧

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const int M=2e3+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
const int P1=1e9+,P2=;
void exgcd(int a,int b,int&x,int&y){
if(!b){x=,y=;return;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
int inv(int x,int mod){
int v1,v2;
exgcd(x,mod,v1,v2);
if(v1<)v1+=mod;
return v1;
}
struct num{
int v1;
void init(int A){
v1=(A+P1)%P1;
}
num operator+(num x){
return (num){(v1+x.v1)%P1};
}
num operator-(num x){
return (num){(v1-x.v1+P1)%P1};
}
num operator-(){
return (num){(P1-v1)%P1};
}
num operator*(num x){
return (num){(LL)(v1)*x.v1%P1};
}
num operator/(num x){
return (num){(LL)(v1)*inv(x.v1,P1)%P1};
}
bool operator==(num x){
return v1==x.v1;
}
bool operator<(num x)const{
return v1<x.v1;
}
};
struct node{num x1,x2,y1,y2;}e[M];
int n;
LL tot;
struct Q{num a,b,c;}q[M];
int sum,p;
struct Ans{num x,y;}ans[M*M];
bool cmp(Ans a,Ans b){return a.x==b.x?a.y<b.y:a.x<b.x;}
void prepare(int k){
q[k].a=e[k].y1-e[k].y2;
q[k].b=e[k].x2-e[k].x1;
q[k].c=-q[k].a*e[k].x1-q[k].b*e[k].y1;
// printf("[%d]",-q[k].a*e[k].x1-q[k].b*e[k].y1==-q[k].a*e[k].x2-q[k].b*e[k].y2);
}
bool flag;
void calc(int k1,int k2,num& x,num& y){
flag=;
num K=q[k1].a*q[k2].b-q[k2].a*q[k1].b;
if(K==(num){}){
flag=;
return;
}
y=(q[k2].a*q[k1].c-q[k1].a*q[k2].c)/K;
x=(q[k2].b*q[k1].c-q[k1].b*q[k2].c)/K;
}
int main(){
n=read();
for(int i=;i<=n;i++){
e[i].x1.init(read()); e[i].y1.init(read());
e[i].x2.init(read()); e[i].y2.init(read());
prepare(i);
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
num x,y;
calc(i,j,x,y);
if(!flag)ans[++sum]=(Ans){x,y};
}
}
sort(ans+,ans++sum,cmp);
p=;
for(int i=;i<=sum;i++){
if(ans[i].x==ans[i-].x&&ans[i].y==ans[i-].y){
p++;
if(i==sum){
LL now=(+sqrt(+*p))/;
if(now>=) tot=tot+now*(now-)*(now-)*(now-)/;
break;
}
}
else{
LL now=(+sqrt(+*p))/;
if(now>=) tot=tot+now*(now-)*(now-)*(now-)/;
p=;
}
}
printf("%lld\n",tot/);
return ;
}

汕头市队赛 SRM1X T1的更多相关文章

  1. 汕头市队赛 SRM1X T2 ——扫描线

    绵津见-终 SRM 13 背景 “西瓜也是可以种在海上的!”——绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜 ...

  2. 汕头市队赛 SRM14 T1 计算几何瞎暴力

    计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...

  3. 汕头市队赛 SRM10 T1 贪心只能过样例

    贪心只能过样例 SRM 10 描述 给出n个数a[i](1<=a[i]<=n),问最多能把这些数分成几组,使得每个数a[i]所在的组至少有a[i]个数 输入格式 第一行一个整数n,接下来n ...

  4. 汕头市队赛 SRM10 T1模拟只会猜题意

    模拟只会猜题意 SRM 10 描述 有一本n个单词的词典,求按下列方法能造出的不相同的词汇数目.  1.词典中的单词是一个词. 2.能分为两部分的,其中前一部分是一个词典词或者其非空前缀,后一部分是一 ...

  5. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  6. 汕头市队赛SRM 20 T1魔法弹

    T1 背景 “主角光环已经不能忍啦!” 被最强控制AP博丽灵梦虐了很长一段时间之后,众人决定联合反抗. 魂魄妖梦:“野怪好像被抢光了?” 十六夜咲夜:“没事,我们人多.” 然后当然是以失败告终了. 八 ...

  7. 汕头市队赛 yyl杯1 T1

    A SRM 05 - YYL 杯 R1 背景 傻逼题 描述 给一个序列,序列里只有两种元素1和2.现在要从序列里选出一些非空子序列使得子序列里两种元素数量相同.问有多少种方案数? 输入格式 多组数据 ...

  8. 汕头市队赛SRM15

    T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...

  9. 汕头市队赛 SRM 07 D 天才麻将少女kpm

    这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周叒打了n场麻将,但她这次又没控分,而且 ...

随机推荐

  1. keil调试问题记录

    1.错误类型:L6218E:Underfined symbol &&&&&&&&& (referred form &&a ...

  2. python基础之入门基础

    编程语言分类 机器语言 使用二进制代码直接编程,直接与硬件交互,执行速度非常快,灵活,但是开发难度高,开发效率低下,缺乏移植性. 汇编语言 对机器语言指令进行了英文封装,较机器语言容易记忆,直接与硬件 ...

  3. spark提交运算原理

    前面几天元旦过high了,博客也停了一两天,哈哈,今天我们重新开始,今天我们介绍的是spark的原理 首先先说一个小贴士: spark中,对于var count = 0,如果想使count自增,我们不 ...

  4. Oozie 之 sqoop 实战

    1.创建 lib 目录并拷贝 mysql 支持包 2.修改 job.properties 文件 nameNode=hdfs://cen-ubuntu.cenzhongman.com:8020 jobT ...

  5. html+css调用服务器端字体

    在浏览网页时,由于客户端没有安装某些特殊字体,导致网页文字无法按设计正常显示,这时我们可以使用服务器字体来避免这种现象的发送 语法 @font-face { /* 自定义字体名称 */ font-fa ...

  6. requestLayout 无效

    今天,listview 的requestLayout 无效. 最后,我用了 getWindow().getDecorView().requestLayout(); 可以了.

  7. (A)eclipse搭建springboot项目入门

    网上许多资料都是用idea的,但是我个人用eclipse习惯了,所以就在eclipse里面自己尝试着写了一个hello. 然而项目建好后却迟迟不能访问!!!网上搜了许多资料都不靠谱! 虽然最后能看到h ...

  8. CSS系列(7)CSS类选择器Class详解

    这一篇文章,以笔记形式写. 1,  CSS 类选择器详解 http://www.w3school.com.cn/css/css_selector_class.asp 知识点: (1)    使用类选择 ...

  9. Python全栈工程师(函数的传参)

     ParisGabriel   感谢 大家的支持                                                               每天坚持 一天一篇 点个订 ...

  10. 平衡二叉树(AVL)

    AVL就是优化二叉查找树 平衡因子不大于1 左 < 根 < 右 具体看代码 #include<bits/stdc++.h> using namespace std; typed ...