結果
問題 | No.1361 [Zelkova 4th Tune *] QUADRUPLE-SEQUENCEの詩 |
ユーザー |
👑 ![]() |
提出日時 | 2020-09-15 22:54:19 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 4,662 bytes |
コンパイル時間 | 429 ms |
コンパイル使用メモリ | 82,044 KB |
実行使用メモリ | 111,492 KB |
最終ジャッジ日時 | 2024-12-27 18:26:56 |
合計ジャッジ時間 | 13,756 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 RE * 34 |
ソースコード
def General_Binary_Increase_Search(L,R,cond,Integer=True,ep=1/(1<<20)):"""条件式が単調増加であるとき,一般的な二部探索を行う.L:解の下限R:解の上限cond:条件(1変数関数,広義単調減少 or 広義単調減少を満たす)Integer:解を整数に制限するか?ep:Integer=Falseのとき,解の許容する誤差"""if not(cond(R)):return Falseif Integer:R+=1while R-L>1:C=L+(R-L)//2if cond(C):R=Celse:L=Creturn Relse:while (R-L)>=ep:C=L+(R-L)/2if cond(C):R=Celse:L=Creturn R#================================================def f(x): #負の時の判定Z=0I=0for u in U_pos:if I<V_negative:while u*V_neg[I]<=x:I+=1if I==V_negative:breakZ+=II=0for v in V_pos:if I<U_negative:while v*U_neg[I]<=x:I+=1if I==U_negative:breakZ+=Ireturn Zdef g(x): #正の時の判定Z=0I=V_positivefor u in U_pos:if I>0:while u*V_pos[I-1]>x:I-=1if I==0:breakZ+=II=0for v in V_neg:if I<U_negative:while v*U_neg[-(I+1)]<=x:I+=1if I==U_negative:breakZ+=Ireturn Z#================================================# pq=x なる p in G,q in H を求める.def h(x,G,H):if x==0:if 0 in G:return (0,H[0])else:return (G[0],0)H=set(H)for g in G:if g==0:continueif (x%g==0) and (x//g in H):return (g,x//g)return None#================================================#入力K,L,M,N,S=map(int,input().split())A=list(map(int,input().split()))B=list(map(int,input().split()))C=list(map(int,input().split()))D=list(map(int,input().split()))#================================================#制約確認assert 1<=K<=500,"Kが制約外(K={})".format(K)assert 1<=L<=500,"Lが制約外(L={})".format(L)assert 1<=M<=500,"Mが制約外(M={})".format(M)assert 1<=N<=500,"Nが制約外(N={})".format(N)assert 1<=S<=K*L*M*N,"Sが制約外(S={})".format(S)assert len(A)==K,"Aの長さが違う(K={},Aの長さ={})".format(K,len(A))assert len(B)==L,"Bの長さが違う(L={},Bの長さ={})".format(L,len(B))assert len(C)==M,"Cの長さが違う(M={},Cの長さ={})".format(M,len(C))assert len(D)==N,"Dの長さが違う(N={},Dの長さ={})".format(N,len(D))A_abs_max=abs(max(A,key=lambda a:abs(a)))B_abs_max=abs(max(B,key=lambda b:abs(b)))C_abs_max=abs(max(C,key=lambda c:abs(c)))D_abs_max=abs(max(D,key=lambda d:abs(d)))assert A_abs_max<=3*10**4,"Aが制約外(max |A|={})".format(A_abs_max)assert B_abs_max<=3*10**4,"Bが制約外(max |B|={})".format(B_abs_max)assert C_abs_max<=3*10**4,"Cが制約外(max |C|={})".format(C_abs_max)assert D_abs_max<=3*10**4,"Dが制約外(max |D|={})".format(D_abs_max)#================================================# (A,B),(C,D)の2つに分けて考える.U=[a*b for a in A for b in B]U.sort()V=[c*d for c in C for d in D]V.sort()U_pos=[u for u in U if u>0]U_neg=[u for u in U if u<0]V_pos=[v for v in V if v>0]V_neg=[v for v in V if v<0]U_positive=len(U_pos)U_negative=len(U_neg)U_zero=K*L-(U_positive+U_negative)V_positive=len(V_pos)V_negative=len(V_neg)V_zero=M*N-(V_positive+V_negative)#================================================# Eの正,ゼロ,負の個数を求めるE_positive=U_positive*V_positive+U_negative*V_negativeE_negative=U_positive*V_negative+U_negative*V_positiveE_zero=K*L*M*N-(E_positive+E_negative)#================================================# Jを求める.U_abs_max=abs(max(U,key=lambda u:abs(u)))V_abs_max=abs(max(V,key=lambda v:abs(v)))Abs_max=U_abs_max*V_abs_max+1if S<=E_negative: #負確定Ans=General_Binary_Increase_Search(-Abs_max,0,lambda x:f(x)>=S)elif E_negative+1<=S<=E_negative+E_zero: #ゼロ確定Ans=0else: #正確定Ans=General_Binary_Increase_Search(0,Abs_max,lambda x:g(x)>=S-(E_negative+E_zero))#================================================# T=abcd なる a,b,c,dを求める.alpha,beta=h(Ans,U,V)a,b=h(alpha,A,B)c,d=h(beta ,C,D)#================================================#出力print(Ans)print(a,b,c,d)