木之本樱

背景

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

描述

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

魔法世界里,空地是无限大的。所有的树排成了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. mybatis在where中比较复杂的判断

    <if test="param.applicationStateInNumber != null and param.applicationStateInNumber != ''&qu ...

  2. mysql学习第三天练习(流程控制函数)

    -- 流程控制函数 -- 1.查询员工部门号,并赋予部门名 select empno,ename,deptno,case deptno then '10部门' then '20部门' else '30 ...

  3. string函数Contains()实例

    public bool Contains(string value)如果值参数出现在此字符串内,或者值为空字符串(“”),则为true; 否则为false using System; class Ex ...

  4. 独立开发unity2d游戏的问答群

    129443731 有志独立开发游戏的,只讨论最新的unity2d技术的.群里面主要已问答为主,喜欢聊天的就别加群了,灌水多了会被t.希望能对unity2d比较了解的已及喜欢学习的人加入.

  5. LeetCode - Merge Interval.

    Merge Intervals 2014.2.26 21:28 Given a collection of intervals, merge all overlapping intervals. Fo ...

  6. 《Cracking the Coding Interview》——第17章:普通题——题目6

    2014-04-28 22:49 题目:给定一个整数数组.如果你将其中一个子数组排序,那么整个数组都变得有序.找出所有这样子数组里最短的一个. 解法:线性时间,常数空间内可以解决,思想类似于动态规划. ...

  7. DOS程序员手册(九)

    第14章参考手册概述     本书余下的章节将向读者们介绍BIOS.DOS各种各样API函数和服务,作为一名程 序员,了解和掌握这些知识是很有好处的.在所介绍的参考手册中,每部手册都汇集了大 量的资源 ...

  8. SQL Server VALUES 使用一记住

    VALUES 用得最多,最常见的就是 INSER INOT 表名(列名1,列名2,......) VALUES(值1,值2,......) ------------------------------ ...

  9. Python 高级 I/O 多路复用

    Table of Contents 前言 select selectors 结语 参考链接 前言 第一次接触和 I/O 多路复用相关的概念是在书 CSAPP1 的并发编程章节,当时在了解了这个概念后只 ...

  10. Pytest+allure+jenkins生成测试报告

    allure集成jenkins下载地址.下载相关版本的allure包 http://updates.jenkins-ci.org/download/plugins/allure-jenkins-plu ...