ICPC瀋陽 D A Bite of Teyvat

·

#include<bits/stdc++.h>
#define M 100005
#define PI 3.14159265358979323846
#define D long double 
#define eps 1e-11
using namespace std;

D XX=0,YY=0;
D sqr(D x){return x*x;}

struct pt{
    int x,r;
    pt(int X=0,int R=0){x=X;r=R;}
    void rd(){scanf("%d%d",&x,&r);}
    friend bool operator <(pt a,pt b){
        if(a.x!=b.x) return a.x<b.x;
        return a.r<b.r;
    }
    int L(){return x-r;}
    int R(){return x+r;}
    D geth(){
        if(!(x<=XX&&XX<=x+r)) return 0;
        return sqrt(sqr(r)-sqr(XX-x));
    }
}; set<pt> s;

D S(pt now){
    D ans=PI;
    return ans*now.r*now.r;
}

D S(pt a,pt b){///!!!
    if(b<a) swap(a,b);
    if(a.x+a.r<b.x-b.r+eps) return 0;
    D A=a.r,B=b.r,C=b.x-a.x;
    D P=(A+B+C)/2.;
    D S2=sqrt(P*(P-A)*(P-B)*(P-C));
    D cosA= (sqr(A)+sqr(C)-sqr(B))/(2*A*C);
    D cosB= (sqr(B)+sqr(C)-sqr(A))/(2*B*C);
    D sinA=sqrt(1-sqr(cosA));
    D sinB=sqrt(1-sqr(cosB));
    D sitaA=acos(cosA);
    D sitaB=acos(cosB);
    D sA=sitaA*sqr(A)*0.5;
    D sB=sitaB*sqr(B)*0.5;
    XX=a.x+A*cosA;
    YY=A*sinA;
    return 2*(sA+sB-S2);
}

bool in(pt son,pt fa){
    return fa.L()<=son.L()&&son.R()<=fa.R();
}

bool in(pt l,pt r,pt son){
    if(S(l,r)==0) return 0;
    int h=son.geth();
    return h<=YY+eps;//eps!!
}

int main(){
    s.insert(pt(-M,0));
    s.insert(pt(M,0));
    int n; cin>>n;
    D ans=0;
    while(n--){
        pt now; now.rd();
        set<pt>::iterator e,itr=s.upper_bound(now);
        set<pt>::iterator itl=itr; itl--;
        bool isIn=0;
        if(in(now,*itr)) isIn=1;
        if(in(now,*itl)) isIn=1;
        if(in(*itl,*itr,now)) isIn=1;
        if(isIn){
            printf("%.10lf\n",ans);
            continue;
        }
        ans+=S(*itl,*itr);
        while(in(*itr,now)){
            e=itr++;
            ans-=S(*e)-S(*e,*itr);
            s.erase(e);
        }
        while(in(*itl,now)){
            e=itl--;
            ans-=S(*e)-S(*e,*itl);
            s.erase(e);
        }
        ans+=S(now)-S(now,*itl)-S(now,*itr)+S(*itl,*itr);
        s.insert(now);
        printf("%.10Lf\n",ans);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章