注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

时光机TimeMachine

——一个退役OIer

 
 
 

日志

 
 

[BZOJ3775]点和直线  

2014-12-05 10:46:46|  分类: Problems |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3775: 点和直线

水题……
我好傻逼啊……
式子里少了个*2 && -1想成1 搞了好几h……快吐血了
题解在代码下方

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int scan(){
char cc=' ';int re=0,fh=1;
while(cc==' '||cc=='\r'||cc=='\n')cc=getchar();
if(cc=='+')cc=getchar(),fh=1;
if(cc=='-')cc=getchar(),fh=-1;
while('0'<=cc&&cc<='9'){
re=re*10+cc-'0';
cc=getchar();
}return re*fh;
}
const int N = 120000+10;
const double eps = 1e-9;
int n,m,ln,T;
short v[N];
double fk[N][4];
double line[N][3],a,b,c,d,e,f;
void add(int i,double fh){
double A,B,C,T;
A = line[i][0];B = line[i][1];C = line[i][2];
T = A*A+B*B;T = 1/T;
a += fh*(A*A*T);
b += fh*(2*A*C*T);
c += fh*(2*A*B*T);
d += fh*(B*B*T);
e += fh*(2*B*C*T);
f += fh*(C*C*T);
}
void output(){
double x,y,tmp;
tmp = (4*a*d - c*c);
if(fabs(tmp) < eps){
if(fabs(c) < eps){//c == 0
if(fabs(a) > eps && fabs(d) > eps){
x = -b / (2*a);
y = -e / (2*d);
//cout << "RE1";
}else if(fabs(a) > eps && fabs(d) < eps){
x = -b / (2*a);
y = 0;
//cout << "RE2";
}else if(fabs(a) < eps && fabs(d) > eps){
x = 0;
y = -e / (2*d);
//cout << "RE3";
}else x = y = 0;
}else{
x = 0;
y = -b/c;
}
}else{
tmp = 1/tmp;
x = (c*e - 2*b*d)*tmp;
y = (b*c - 2*a*e)*tmp;
}
tmp = (a*x + b)*x + c*x*y + (d*y + e)*y + f;
T++;
printf("%.2f\n",(double)tmp+eps);
}
int main(){
int i,j,tmp;
n = scan();
for(i=1;i<=n;i++){
double x[2],y[2];
tmp = scan();
switch(tmp){
case 0:{
scanf("%lf%lf%lf%lf",&x[0],&y[0],&x[1],&y[1]);
ln++;
fk[ln][0]=x[0];fk[ln][1]=y[0];
fk[ln][2]=x[1];fk[ln][3]=y[1];

if(fabs(x[0] - x[1]) > eps){
line[ln][0] = (y[0]-y[1])/(x[0]-x[1]);
line[ln][1] = -1;
line[ln][2] = y[0] - line[ln][0]*x[0];
}else{
line[ln][0] = -1;
line[ln][1] = 0;
line[ln][2] = x[0];
}
add(ln,1);
v[ln] = 1;
break;
}
case 1:{
tmp = scan();
add(tmp,-1);
v[tmp]=0;
break;
}
case 2:{
output();
break;
}
}
//cout << a << ' '<<b << ' '<<c <<' '<<e << ' '<<e<<' '<<f<<endl;
//printf("\n%f %f %f %f %f %f\n",a,b,c,d,e,f);
}
return 0;
}

题解:
求出点到直线距离后合并同类项
然后再求偏导,解一个二元一次方程组。
注意特判各种 /0 的情况

  评论这张
 
阅读(21)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017