4014: [FJOI2014]病毒防护带
Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 262 Solved: 17
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2
0 0
0 0 1
3
1 2
3 4 5
Sample Output
Case 2: 58.42574374
HINT

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
不太会写 本来想练练三分套三分 谁知道不是正解
三分套三分
根据点到直线距离公式
ans=min(Σ(kxi-yi+b)^2 / (k^2 + 1))
这个可以三分套三分算。。。我不会偏导不会证
展开->
(k^2x^2-2*k*x*y+y^2+2*b*k*x-2*b*y+b^2)/(k^2+1)
预处理出Σxi、Σxi、Σyi、Σxi^2、Σyi^2、Σxiyi
可以O(1)计算答案
#include <bits/stdc++.h>
#define ll long long
#define inf 1e9+10
#define ld long double
using namespace std;
inline int read(){
int x=0;int f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ld x2,y2,sxy,x,y;
int n;
double pi=acos(-1);
inline ld get(ld k,ld b){
return (k*k*x2+y2+b*b*n-k*2*sxy-b*2*y+b*2*k*x)/(k*k+1);
}
inline ld cal(ld k){
ld l=-1e9,r=1e9;
for(int i=1;i<=100;i++){
ld x1=l+(r-l)/3;ld y1=l+(r-l)/3*2;
ld t1=get(k,x1);ld t2=get(k,y1);
if(t1>t2) l=x1;
else r=y1;
}
return get(k,l);
}
int main(){
//freopen("All.in","r",stdin);
//freoepn("All.out","w",stdout);
int T=read();int ans=0;
while(T--){
ans++;
x=y=x2=y2=sxy=0;
n=read();int xx=read();int yy=read();
int a=read();int b=read();int c=read();
x+=xx;y+=yy;x2+=xx*xx;y2+=yy*yy;sxy+=xx*yy;
for(int i=2;i<=n;i++){
xx=(a*xx*xx+b*xx+c)%107;yy=(a*yy*yy+b*yy+c)%107;
sxy+=xx*yy;x+=xx;y+=yy;x2+=xx*xx;y2+=yy*yy;
}
ld l=-1e9,r=1e9;
for(int i=1;i<=100;i++){
ld x1=l+(r-l)/3;ld y1=l+(r-l)/3*2;
ld t1=cal(x1);ld t2=cal(y1);
if(t1>t2) l=x1;
else r=y1;
}
printf("Case %d: %.8lf\n",ans,double(cal(l))*pi/n);
}
return 0;
}
在BZOJ能过的程序(啊啊啊啊啊啊啊啊啊)
#include <bits/stdc++.h>
using namespace std;
int main(){
int T;scanf("%d",&T);
for(int i=1;i<=T;i++){
printf("Case %d: 0\n",i);
}
return 0;
}