Editorial for Bedao Grand Contest 05 - STOLEN
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Code mẫu
#include <bits/stdc++.h> #define ld long double using namespace std; ld dttamgiac(ld xa, ld xb, ld xc, ld ya, ld yb, ld yc){ return (0.50000*abs((xb-xa)*(yc-ya)-(xc-xa)*(yb-ya))); } ld res,a[5],b[5],c[5],d[5]; ld mu4(ld x){ return x*x*x*x; } ld mu3(ld x){ return x*x*x; } ld mu2(ld x){ return x*x; } ld ptbac1(ld _a, ld _b){ return -_b/_a; } ld ptbac2(ld _a, ld _b,ld _c){ return -_b/(2.0000*_a); } ld ptbac3(ld _a, ld _b, ld _c, ld _d){ ld delta=_b*_b-3.0000*_a*_c; ld ans=0; if(delta==0){ ans=(-_b+cbrt(mu3(_b)-27.000*mu2(_a)*_d))/(3.0000*_a); return ans; } ld k=(9.0000*_a*_b*_c-2.0000*_b*_b*_b-27.0000*_a*_a*_d)/(2.000*sqrt(mu3(abs(delta)))); if( delta>0 && abs(k)>1) ans=(sqrt(delta)*abs(k)/(3.0000*_a*k))*(cbrt(abs(k)+sqrt(mu2(k)-1))+cbrt(abs(k)-sqrt(mu2(k)-1)))-_b/(3.0000*_a); if(delta<0) ans=(sqrt(abs(delta))/(3.0000*_a))*(cbrt(k+sqrt(mu2(k)+1))+cbrt(k-sqrt(mu2(k)+1)))-_b/(3.0000*_a); return ans; } ld giao(int tt1,int tt2){ int _a=a[tt1]-a[tt2], _b=b[tt1]-b[tt2] , _c=c[tt1]-c[tt2], _d=d[tt1]-d[tt2]; if(_a==0&&_b==0) return ptbac1(_c,_d); if(_a==0) return ptbac2(_b,_c,_d); return ptbac3(_a,_b,_c,_d); } ld cal(ld x, int tt1, int tt2){ return (((a[tt1]-a[tt2])/4.0000)*mu4(x)+((b[tt1]-b[tt2])/3.000)*mu3(x)+((c[tt1]-c[tt2])/2.000)*mu2(x)+(d[tt1]-d[tt2])*x); } ld tichphan(ld _x, ld _y, int tt1, int tt2){ return (cal(_y,tt1,tt2)-cal(_x,tt1,tt2)); } int main() { freopen("STOLEN.INP","r",stdin); freopen("STOLEN.OUT","w",stdout); for(int i=1;i<=3;i++){ cin>>a[i]>>b[i]>>c[i]>>d[i]; if(i!=1&&a[i]==0&&b[i]==0){ swap(a[i],a[1]); swap(b[i],b[1]); swap(c[i],c[1]); swap(d[i],d[1]); } } ld x1,x2,x3; x1=giao(1,2); x2=giao(2,3); x3=giao(1,3); if(a[1]==0&&a[2]==0&&a[3]==0&&b[1]==0&&b[2]==0&&b[3]==0){ ld Y1=a[1]*mu3(x1)+b[1]*mu2(x1)+c[1]*x1+d[1]; ld Y2=a[2]*mu3(x2)+b[2]*mu2(x2)+c[2]*x2+d[2]; ld Y3=a[3]*mu3(x3)+b[3]*mu2(x3)+c[3]*x3+d[3]; cout<<setprecision(6)<<fixed<<dttamgiac(x1,x2,x3,Y1,Y2,Y3); return 0; } if(x1>x3){ swap(x1,x3); swap(a[2],a[3]); swap(b[2],b[3]); swap(c[2],c[3]); swap(d[2],d[3]); } ld xx1=a[1]*mu3(x2)+b[1]*mu2(x2)+c[1]*x2+d[1]; ld xx2=a[2]*mu3(x2)+b[2]*mu2(x2)+c[2]*x2+d[2]; if(xx1>xx2){ if(x1<x2&&x2<x3) res=tichphan(x1,x2,1,2)+tichphan(x2,x3,1,3); else{ if(x2<x1) res=tichphan(x2,x3,1,3)-tichphan(x2,x1,1,2); else res=tichphan(x1,x2,1,2)-tichphan(x3,x2,1,3); } } else{ if(x1<x2&&x2<x3) res=tichphan(x1,x2,2,1)+tichphan(x2,x3,3,1); else{ if(x2<x1) res=tichphan(x2,x3,3,1)-tichphan(x2,x1,2,1); else res=tichphan(x1,x2,2,1)-tichphan(x3,x2,3,1); } } cout<<setprecision(6)<<fixed<<res; }
Comments