Decimalで殴るにはコツが必要

a,b,c = map(int, input().split())

import decimal
from decimal import *
import math

# 不要
# decimal.getcontext().prec = 2000

A = Decimal(a)
B = Decimal(b)
C = Decimal(c)

# こういうルートのとり方もある
root = Decimal("0.5")

# if math.sqrt(A)+math.sqrt(B)<math.sqrt(C): # WA
if A.sqrt()+B.sqrt()<C.sqrt(): # AC
# if (A**root)+(B**root)<(C**root): # AC
    print("Yes")
else:
    print("No")

橋・関節点・lowlink (自分用)

verify (AtCoder)✅

verify (AOJ)✅

long longのオーバーフローチェックと同値式

背景

  • ABC-Dでlong longのオーバーフローチェックが必要でした(C++erの場合)

同値

理解

  • 私も理解したので絵を置いておく。(v,x,Mは正の整数とする)

f:id:peroon:20210221051936p:plain

D - Max Median

testcase

10 6
8 3 5 7 1 9 1 6 10 10

Answer : 7
  • K=6で全てのmedianを調べるだけだと答えは6になりますが、K=7で後端7つのmedianをとると、より良いmedian 7が得られます
  • なのでeditorialのように累積和とそれの先端からのmin配列を使う必要があります
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    // input
    ll N,K;
    cin>>N>>K;

    VI A(N);
    rep(i, N) cin >> A[i];

    ll ma = MAX(A);

    auto f = [&](ll x){
      auto B = A;
      rep(i,N){
        if(B[i]>=x){
          B[i]=1;
        }else{
          B[i]=-1;
        }
      }

      VI Acc = {0};
      for(ll b : B)Acc.push_back(b);
      rep(i,N){
        Acc[i+1] += Acc[i];
      }

      auto AccMin = Acc;
      rep(i,N){
        AccMin[i+1] = min(AccMin[i], AccMin[i+1]);
      }

      FOR(i,K,N+1){
        ll a = Acc[i];
        ll b = AccMin[i-K];
        ll v = a-b;
        if(v>0)return true;
      }
      return false;
    };

    ll left=1;//can
    ll right=ma+1;//can't

    while(left+1!=right){
      ll center = (left+right)/2;
      if(f(center)){
        left=center;
      }else{
        right=center;
      }
    }
    p(left);
    
    return 0;
}

C - Floor and Mod

f:id:peroon:20210218061303p:plain