結果
| 問題 | 
                            No.1319 最強とんがりコーン
                             | 
                    
| コンテスト | |
| ユーザー | 
                            👑  Kazun
                         | 
                    
| 提出日時 | 2021-07-16 18:31:11 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 4,295 bytes | 
| コンパイル時間 | 142 ms | 
| コンパイル使用メモリ | 81,920 KB | 
| 実行使用メモリ | 87,168 KB | 
| 最終ジャッジ日時 | 2024-07-06 05:21:28 | 
| 合計ジャッジ時間 | 6,587 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | -- * 1 | 
| other | TLE * 1 -- * 69 | 
ソースコード
from math import sqrt,sin,cos,tan,asin,acos,atan2,pi,floor
def compare(x,y,ep):
    """ x,y の大小比較をする. ただし, ep の誤差は同一視する.
    [Input]
    x,y: float
    ep: float
    [Output]
    x>y: 1
    x=y: 0
    x<y: -1
    """
    if x-y>ep: return 1
    elif x-y<-ep: return -1
    else: return 0
class Point():
    __slots__=["x","y","id"]
    ep=1e-9
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y
        self.id=0
    def sign(self,a):
        if a<-self.ep:
            return -1
        elif a>self.ep:
            return 1
        else:
            return 0
    #文字列
    def __str__(self):
        return "({}, {})".format(self.x,self.y)
    __repr__=__str__
    #Bool
    def __bool__(self):
        return self.sign(self.x)!=0 or self.sign(self.y)!=0
    #等号
    def __eq__(self,other):
        return self.sign(self.x-other.x)==0 and self.sign(self.y-other.y)==0
    #不等号
    def __ne__(self,other):
        return not self==other
    #比較(<)
    def __lt__(self,other):
        T=self.sign(self.x-other.x)
        if T:
            return T<0
        else:
            return self.sign(self.y-other.y)<0
    #比較(<=)
    def __le__(self,other):
        return self<other or self==other
    #比較(>)
    def __gt__(self,other):
        return other<self
    #比較(>=)
    def __ge__(self,other):
        return other<=self
    #正と負
    def __pos__(self):
        return self
    def __neg__(self):
        return Point(-self.x,-self.y)
    #加法
    def __add__(self,other):
        return Point(self.x+other.x,self.y+other.y)
    #減法
    def __sub__(self,other):
        return Point(self.x-other.x,self.y-other.y)
    #乗法
    def __mul__(self,other):
        x,y=self.x,self.y
        u,v=other.x,other.y
        return Point(x*u-y*v,x*v+y*u)
    def __rmul__(self,other):
        if isinstance(other,(int,float)):
            return Point(other*self.x,other*self.y)
    #除法
    def __truediv__(self,other):
        if other==0:
            raise ZeroDivisionError
        return Point(self.x/other,self.y/other)
    #絶対値
    def __abs__(self):
        return sqrt(self.x*self.x+self.y*self.y)
    norm=__abs__
    def norm_2(self):
        return self.x*self.x+self.y*self.y
    #回転
    def rotate(self,theta):
        x,y=self.x,self.y
        s,c=sin(theta),cos(theta)
        return Point(c*x-s*y,s*x+c*y)
    def __iter__(self):
        yield self.x
        yield self.y
    def __hash__(self):
        return hash((self.x,self.y))
    def latticization(self,delta=1e-7):
        if abs(self.x-floor(self.x+0.5))<delta and abs(self.y-floor(self.y+0.5))<delta:
            self.x=floor(self.x+0.5)
            self.y=floor(self.y+0.5)
    def normalization(self):
        a=abs(self)
        self.x/=a
        self.y/=a
    def dot(self,other):
        return self.x*other.x+self.y*other.y
    def det(self,other):
        return self.x*other.y-self.y*other.x
    def arg(self):
        return atan2(self.y,self.x)
class Circle():
    __slots__=["P","r","id"]
    ep=1e-9
    def __init__(self,Center:Point,Radius:float):
        """ 2点 P を中心とする半径 r の円を生成する.
        P: Point
        r>=0
        """
        assert Radius>=0
        self.P=Center
        self.r=Radius
        self.id=4
    def __str__(self):
        return "[Circle] Center: {}, Radius: {}".format(self.P,self.r)
    __repr__=__str__
    def __contains__(self,P):
        return abs(abs(P-self.P)-self.r)<self.ep
def Circles_Intersection_Area(C,D):
    """ 2つの円 C, D の共通部分の面積を求める.
    C, D: Circle
    """
    d=abs(C.P-D.P)
    r=C.r; s=D.r
    ep=max(C.ep, D.ep)
    if compare(d,r+s,ep)==1:
        return 0
    if compare(d,abs(r-s),ep)==-1:
        a=min(r,s)
        return pi*a*a
    alpha=acos((d*d+r*r-s*s)/(2*d*r))
    beta =acos((d*d-r*r+s*s)/(2*d*s))
    X=r*r*alpha
    Y=s*s*beta
    Z=d*r*sin(alpha)
    return X+Y-Z
#=================================================
R,H,D=map(float,input().split())
z=0
delta=H*(1e-8)
X=Circle(Point(0,0),0)
Y=Circle(Point(D,0),0)
V=0
while z<H:
    r=R*(1-z/H)
    X.r=Y.r=r
    V+=Circles_Intersection_Area(X,Y)*delta
    z+=delta
print(V)
            
            
            
        
            
Kazun