結果
問題 | No.325 マンハッタン距離2 |
ユーザー |
|
提出日時 | 2015-12-18 09:49:57 |
言語 | Ruby (3.4.1) |
結果 |
AC
|
実行時間 | 94 ms / 1,000 ms |
コード長 | 6,094 bytes |
コンパイル時間 | 82 ms |
コンパイル使用メモリ | 7,552 KB |
実行使用メモリ | 12,288 KB |
最終ジャッジ日時 | 2024-12-26 05:56:35 |
合計ジャッジ時間 | 3,747 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 |
コンパイルメッセージ
Syntax OK
ソースコード
#! ruby# yukicoder My Practice# author: Leonardone @ NEETSDKASUdef gs() gets.chomp enddef gi() gets.to_i enddef gss() gets.chomp.split enddef gis() gss.map(&:to_i) enddef nmapf(n,f) n.times.map{ __send__ f } enddef arr2d(h,w,v=0) h.times.map{[v] * w} enddef ngs(n) nmapf n,:gs enddef ngi(n) nmapf n,:gi enddef ngss(n) nmapf n,:gss enddef ngis(n) nmapf n,:gis enddef for2p(hr,wr,&pr) hr.each{|i|wr.each{|j| yield(i,j)}} enddef nsum(n) n * (n + 1) / 2 endRANDOM_TEST = 0TEST_RUN = (RANDOM_TEST == 0) && false=begin1) D範囲に完全内包1.1: 軸に接しない3 1 10 9 1001.2: 軸に接する3 0 10 8 1001.3: 軸をまたぐ3 -1 10 7 1001.4: 原点を含む-3 -4 10 8 1002) D範囲を完全内包-10 -12 15 14 93) 一部だけD範囲と重なる3.1: 三角範囲Dに入る3.1.1: 軸に接しない2 3 12 11 103.1.2: 片軸にだけ接する0 3 12 11 103.1.3: 両軸に接する0 0 12 11 103.2: 台形範囲Dに入る3.2.1: 軸に接しない4 2 15 6 133.2.2: 片軸に接する4 0 15 6 133.2.3: 両軸に接する0 0 15 6 133.3: 五角形範囲Dに入る3.3.1: 軸に接しない5 2 16 12 243.3.2: 片軸に接する5 0 16 12 243.3.3: 両軸に接する0 0 16 12 244) Dの範囲の完全外側10 13 19 18 11[1] テストケース-3 -12 8 -1 11[2] テストケース-13 -8 10 8 12[3] テストケース4 7 10 11 11[4] テストケース5 3 11 20 30=enddef bruteforce(x1, y1, x2, y2, d)count = 0(y1..y2).each do |y|(x1..x2).each do |x|count += 1 if x.abs + y.abs <= dendendcountenddef make_random_case()x1 = rand(-20..20)y1 = rand(-20..20)x2 = x1 + rand(1..40)y2 = y1 + rand(1..40)d = rand(0..50)[x1, y1, x2, y2, d]enddef bunkatsu(z1_,z2_)z1, z2 = [z1_, z2_].minmaxzmin, zmax = [z1.abs, z2.abs].minmaxcasewhen zmin == 0[[0, 0], [1, zmax]]when z2 < 0 || 0 < z1[[zmin, zmax]]when z1 < 0 && 0 < z2[[0, 0], [1, zmin], [1, zmax]]elsesleep 10[]endend# 4) Dの範囲の完全外側def perfectly_outside?((x1, x2), (y1, y2), d)d < x1 + y1end# Dの範囲に完全内包def perfectly_inside?((x1, x2), (y1, y2), d)x2 + y2 <= denddef perfectly_inside_count((x1, x2), (y1, y2), d)count = (x2 - x1 + 1) * (y2 - y1 + 1)puts "inside [%d, %d] * [%d, %d], count: %d" % [x1, x2, y1, y2, count] if TEST_RUNcountend# 点def dot?((x1, x2), (y1, y2), d)x1 == x2 && y1 == y2 && x1 == y1enddef dot_count((x1, x2), (y1, y2), d)count = 0 <= d - (x1 + y1) ? 1 : 0puts "dot [%d, %d] * [%d, %d], count: %d" % [x1, x2, y1, y2, count] if TEST_RUNcountend# 直線def line?((x1, x2), (y1, y2), d)x1 == x2 || y1 == y2enddef line_count((x1, x2), (y1, y2), d)count = 0if d < x2 + y2count = d - (x1 + y1) + 1elsecount = (x2 + y2) - (x1 + y1) + 1endputs "line [%d, %d] * [%d, %d], count: %d" % [x1, x2, y1, y2, count] if TEST_RUNcountend# 三角形def triangle?((x1, x2), (y1, y2), d)d <= [x1 + y2, x2 + y1].minenddef triangle_count((x1, x2), (y1, y2), d)count = nsum(d - (x1 + y1) + 1)puts "triangle [%d, %d] * [%d, %d], count: %d" % [x1, x2, y1, y2, count] if TEST_RUNcountend# 台形def trapezoid?((x1, x2), (y1, y2), d)d <= [x1 + y2, x2 + y1].maxenddef trapezoid_count((x1, x2), (y1, y2), d)short_end, long_end = [x1 + y2, x2 + y1].minmaxshort_len = short_end - (x1 + y1) + 1long_len = [d, long_end].min - (x1 + y1) + 1count = (short_len * (long_len - short_len)) + nsum(short_len)puts "trapezoid [%d, %d] * [%d, %d], count: %d" % [x1, x2, y1, y2, count] if TEST_RUNputs "end: [%d, %d], len: [%d, %d]" % [short_end, long_end, short_len, long_len] if TEST_RUNcountend# 五角形def pentagon?((x1, x2), (y1, y2), d)[x1 + y2, x2 + y1].max < denddef pentagon_count((x1, x2), (y1, y2), d)count = (x2 - x1 + 1) * (y2 - y1 + 1) - nsum((x2 + y2) - d)puts "pentagon [%d, %d] * [%d, %d], count: %d" % [x1, x2, y1, y2, count] if TEST_RUNcountenddef solve(x1, y1, x2, y2, d)# 1) D範囲に完全内包if [x1.abs, x2.abs].max + [y1.abs, y2.abs].max <= dputs "perfectly inside of D range" if TEST_RUNcount = (x2 - x1).abs.succ * (y2 - y1).abs.succreturn countend# 2) D範囲を完全内包if [x1..x2, y1..y2].all?{|r| r.include?(-d) && r.include?(d)}puts "perfectly inside of Square" if TEST_RUNcount = nsum(d) * 4 + 1return countendxs = bunkatsu(x1, x2)ys = bunkatsu(y1, y2)puts "xs = %s" % [xs.to_s] if TEST_RUNputs "ys = %s" % [ys.to_s] if TEST_RUNcount = 0for2p(ys,xs) {|yt,xt|args = [xt, yt, d]next if perfectly_outside?(*args)casewhen perfectly_inside?(*args)count += perfectly_inside_count(*args)when dot?(*args)count += dot_count(*args)when line?(*args)count += line_count(*args)when triangle?(*args)count += triangle_count(*args)when trapezoid?(*args)count += trapezoid_count(*args)when pentagon?(*args)count += pentagon_count(*args)end}countend################################################if RANDOM_TEST > 0puts "starting RANDOM TEST"RANDOM_TEST.times dotestcase = make_random_casebf = bruteforce(*testcase)count = solve(*testcase)next if bf == countputs "incorrect"puts "testcase: " + testcase.to_sputs "bf=%d count=%d" % [bf, count]breakendputs "finished RANDOM TEST"exitendargs = gisputs "X1=%d, Y1=%d, X2=%d, Y2=%d, D=%d" % args if TEST_RUNbf = bruteforce(*args) if TEST_RUNputs "bruteforce %d" % [bf] if TEST_RUNcount = solve(*args)puts countputs (bf == count ? "" : "in") + "corrct!" if TEST_RUN