汕头市队赛 SRM1X T1
木之本樱
背景
“西瓜是可以种在树上的!”——木之本樱
描述
空地上,一排排的西瓜树拔地而起。
魔法世界里,空地是无限大的。所有的树排成了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的更多相关文章
- 汕头市队赛 SRM1X T2 ——扫描线
		
绵津见-终 SRM 13 背景 “西瓜也是可以种在海上的!”——绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜 ...
 - 汕头市队赛 SRM14 T1 计算几何瞎暴力
		
计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...
 - 汕头市队赛 SRM10 T1  贪心只能过样例
		
贪心只能过样例 SRM 10 描述 给出n个数a[i](1<=a[i]<=n),问最多能把这些数分成几组,使得每个数a[i]所在的组至少有a[i]个数 输入格式 第一行一个整数n,接下来n ...
 - 汕头市队赛 SRM10 T1模拟只会猜题意
		
模拟只会猜题意 SRM 10 描述 有一本n个单词的词典,求按下列方法能造出的不相同的词汇数目. 1.词典中的单词是一个词. 2.能分为两部分的,其中前一部分是一个词典词或者其非空前缀,后一部分是一 ...
 - 汕头市队赛 C KMP codeforces B. Image Preview
		
汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...
 - 汕头市队赛SRM 20 T1魔法弹
		
T1 背景 “主角光环已经不能忍啦!” 被最强控制AP博丽灵梦虐了很长一段时间之后,众人决定联合反抗. 魂魄妖梦:“野怪好像被抢光了?” 十六夜咲夜:“没事,我们人多.” 然后当然是以失败告终了. 八 ...
 - 汕头市队赛 yyl杯1 T1
		
A SRM 05 - YYL 杯 R1 背景 傻逼题 描述 给一个序列,序列里只有两种元素1和2.现在要从序列里选出一些非空子序列使得子序列里两种元素数量相同.问有多少种方案数? 输入格式 多组数据 ...
 - 汕头市队赛SRM15
		
T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...
 - 汕头市队赛 SRM 07 D 天才麻将少女kpm
		
这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. KPM上周叒打了n场麻将,但她这次又没控分,而且 ...
 
随机推荐
- PLC状态机编程-如何在STL中使用状态机
			
搞PLC编程多年,一直不知道状态机,学习matlab后,发现状态机编程异常方便,过去很多编程时的疑惑豁然开朗起来.今天跟大家分享一下如何在STL中使用状态机. 下面是用状态机描述的控制任务. 这个状态 ...
 - 如何将Windows live writer草稿转存到其他电脑上
			
ref:http://www.zhengsiwei.com/how-to-draft-windows-live-writer-archived-on-other-computers/ 在写一篇关于 ...
 - Pascal “熊猫烧香”(骗人的)
			
Pascal仿熊猫烧香病毒,慎用 program japussy;useswindows, sysutils, classes, graphics, shellapi{, registry};cons ...
 - MySQL隐式转换测试
			
Preface There're various data type in MySQL such as number,string,date,time,lob,etc.The data ...
 - webdriver--设置元素等待
			
sleep():脚本执行到某一位置时“睡一会”,再继续执行:参数的单位是s:sleep方法由python的time模块提供,有两种引入和使用方式 import time time.sleep(5) f ...
 - 1、python 循环控制
			
案例1: lucky_num = 19 input_num = int(input("Input the guess number:")) if input_num == luc ...
 - 项目中使用ECharts插件实现统计功能
			
一.前端界面 // 界面中定义一个div,放图表 <div id="box" style="width: 600px;height:400px;padding: 1 ...
 - 孤荷凌寒自学python第十七天初识Python的函数
			
孤荷凌寒自学python第十七天初识Python的函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 函数是能够完成指定运算并返回运算结果的代码块.是结构化编程重要的结构. 我首先发现pyt ...
 - java的四种内部类(转)
			
一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. 1.常规内部类中的方法可以直接使用外部类的实例变量 ...
 - C 语言 进阶
			
清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...