汕头市队赛 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场麻将,但她这次又没控分,而且 ...
随机推荐
- PHP 面向对象 static 和 self 的区别
一.前言 php是世界上最好的语言 php从面向过程走到现在成熟的面向对象体系, 在php面向对象中,静态变量的调用我们可以用这两个self::method和 static::method, 但是很多 ...
- 多通道CNN
在读Convolutional Neural Networks for Sentence Classification 这个文章的时候,它在论文中提出一种模型变种就是 CNN-multichannel ...
- 裸机——I2C 2
前面的随笔完成了I2C时序分析(不涉及仲裁) 现在可以学使用控制器的I2C了. 1.先回顾I2C的基础知识 (1)总线包括SCL + SDA. (2)通信的特点: 同步,串行,电平 所以决定了 I2C ...
- python基础之模块part2
sys: sys模块不同于os模块,这个是跟Python解释器打交道的. sys.argv:返回一个文件名开头,包含后面输入内容的 列表 import sys res = sys.argv print ...
- Android面试收集录18 Android Context详解
Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...
- PHP代码审计6-实战漏洞挖掘-xdcms用户注册页面漏洞
xdcms 源码:xdcms v2.0.8 1.配置 [一直下一步(仅为测试)] #数据库账号root,密码为空:管理员账号/密码:xdcms/xdcms #登录后台 2.查看后台登录页面的配置项[x ...
- I2C中24C02从地址设置
从设备地址 首先,先看一下AT24C02的芯片资料,我们会发现AT24C02有三个地址A0,A1,A2.同时,我们会在资料的Device Address介绍发现I2C器件一共有七位地址码,还有一位是读 ...
- Quartus 11生成pof文件在AS烧写之后,程序无法启动
1. 首先配置成AS,生成.pof文件,选择上面的图标Device 2. 选择Device and Pin Options... 3. 进入配置界面,选择如下 4. 进入下载界面,烧写.pof文件,开 ...
- typeAliasesPackage 配置
mybatis 的 xml 文件中需要写类的全限定名,较繁琐,可以配置自动扫描包路径给类配置别名,有两种配置方式. 方式一: mybatis-config.xml 中配置 <typeAliase ...
- C编译器MinGW安装、下载及在notepad++中运行C程序
一.C编译器MinGW的下载及安装步骤 打开MinGW官网:http://www.mingw.org/ 图一 图二 图三 图四 图五 图六 系统中配置环境变量: 图七 验证是否安装成功: CMD中运行 ...