汕头市队赛 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场麻将,但她这次又没控分,而且 ...
随机推荐
- google云函数实现BigQuery数据操作
Google Cloud Function操作BigQuery数据库. 1.部署云函数时在配置文件中(package.json)添加一项 "@google-cloud/bigquery&qu ...
- No module named 'PyQt5.sip'
使用pyinstaller打包python文件为windows可执行程序可能遇到的问题 pyinstaller yourprogram.py打包的程序双击打开一闪而过,提示上面标题的错误 把pycom ...
- flask项目实战--论坛
项目结构搭建 1:用pycharm创建flask bbs项目 2:分别创建config.py.exts.py.models.py.manage.py文件 创建一个apps包存放前台,后台,公共的模块 ...
- 四大关键步骤掌握CloudOps模型
[TechTarget中国原创] 要让IT运维向云演进,企业必须拥抱自动化,并且改变资源预配的思考方式. 新涌现的术语CloudOps——云运维的简写,指代企业如何运行以及管理基于云的系统.并且,随着 ...
- VSX-3 VSCT文件
关于VSPackage中的VSCT,算是VSX开发中比较重要的一个成员. 我这里给出LearnVSXNow!系列文章关于VSCT的链接,除了#14有译文. #14 #18 #25 看完上面几篇文章,也 ...
- HTTP协议中POST方法和GET方法有那些区别?
GET用于向服务器请求数据,POST用于提交数据 GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作 GET请求的URL有长度限制1k ...
- 《Cracking the Coding Interview》——第7章:数学和概率论——题目1
2014-03-20 01:57 题目:玩篮球投篮,有两种玩法:要么1投1中,要么3投两中.你单次投篮中的概率是p,那么对于不同的p,哪种玩法胜率更高? 解法:第一种总是胜率更高,可以列不等式算算,结 ...
- Python zip()函数实现并行迭代
示例1: for i, j in zip(range(0, 10), range(1, 11)): print(i, j) 输出结果: 0 11 22 33 44 55 66 77 88 99 10 ...
- APP测试用例要考虑的一些方面
安装与卸载:●应用是否可以在IOS不同系统版本或android不同系统版本上安装(有的系统版本过低,应用不能适配)●软件安装后是否可以正常运行,安装后的文件夹及文件是否可以写到指定的目录里.●安装过程 ...
- appium-手势密码实现-automationName 是Appium的情况
1. 红色区域的范围为:[66,575][1014,1523], 由于这块是一个整块,所以无法使用每个点的数据:因此只能使用LockPatternView对象拿到左上角的坐标值 2. 原理, 将九宫 ...