円形領域(Back Jun 10000-Python)
白俊で初めてやったプラチナ問題なので、何とかして解決しようと思います.一日中かかってやっと解けた...これはそんなに時間がかかる問題ではありませんが、いろいろな間違いを修正するのに時間がかかりすぎます.😢
x軸にはN個の円があります.円が交わらない.でも、触れることができます.
円の領域を計算するプログラムを作成してください.
領域は点の集合であり、すべての2点が交差しない円の連続曲線に接続されなければならない.
第1行は円の個数N(1≦N≦300000)を与える.
次のN行では、各円の情報xiおよびriに整数が与えられる.xiは円の中心座標、riは半径です.(-109 ≤ xi ≤ 109, 1 ≤ ri ≤ 109)
入力された円は常に一意です.
最初の行は、円で生成された領域の個数を出力します.
2
1 3
5 1
3
問題の条件から見ると、円は交差しない.
つまり、一つの円があれば、もう一つの円は
1.この円の中に
2.外で
3.いっそ掛けてくれ
この3つの状況しかありません.
したがって
大きな円の内側の円の端点がつながっていると
2つのスペースがありました.
そうでなければ.
空間が一体である
私は再帰でこの問題を解く.
ウォンの中心から半径を引いて、1ウォンの両端座標を2次元配列にして保存する. ウォンの左座標は降順で、左座標が同じなら右座標は昇順である.
このように並べると、左から大きな順番で格納されます. の各円を迂回して、その中の円の端点がつながっているかどうかを確認します. の現在の円と次の円の左座標が同じ場合、次の円に関連する円が検索されます. 個のエンドポイントを接続すると、2つのスペースを増やすことができます.
質問する
x軸にはN個の円があります.円が交わらない.でも、触れることができます.
円の領域を計算するプログラムを作成してください.
領域は点の集合であり、すべての2点が交差しない円の連続曲線に接続されなければならない.
入力
第1行は円の個数N(1≦N≦300000)を与える.
次のN行では、各円の情報xiおよびriに整数が与えられる.xiは円の中心座標、riは半径です.(-109 ≤ xi ≤ 109, 1 ≤ ri ≤ 109)
入力された円は常に一意です.
しゅつりょく
最初の行は、円で生成された領域の個数を出力します.
入力例
2
1 3
5 1
サンプル出力
3
問題を解く
問題の条件から見ると、円は交差しない.
つまり、一つの円があれば、もう一つの円は
1.この円の中に
2.外で
3.いっそ掛けてくれ
この3つの状況しかありません.
したがって
大きな円の内側の円の端点がつながっていると
2つのスペースがありました.
そうでなければ.
空間が一体である
私は再帰でこの問題を解く.
ろんりじゅんじょ
このように並べると、左から大きな順番で格納されます.
コード#コード#
import sys
from bisect import *
sys.setrecursionlimit(10**6)
num = int(input())
circles= []
ans =2
for _ in range(num):
center , banji= map(int,sys.stdin.readline().split())
circles.append([center-banji , center +banji])
circles.sort( key= lambda x:( x[0], -x[1]))
def checking(start_int, end):
if start_int == num:
return 0
elif circles[start_int][1]==end:
return 1
elif circles[start_int][1]!=end:
tmp_int =bisect_left(circles,[circles[start_int][1],])
if circles[tmp_int][0] is not None and circles[tmp_int][0] == circles[start_int][1]:
return 1* checking(tmp_int,end)
else:
return 0
else:
return 0
for i in range(num-1):
if circles[i][0] == circles[i+1][0]:
if circles[i][1] == circles[i+1][1]:
ans+=1
else:
start_int = bisect_left(circles,[circles[i+1][1],])
if circles[start_int][0] == circles[i+1][1]:
if checking(start_int, circles[i][1]) ==1:
ans +=2
else:
ans +=1
else:
ans+=1
else:
ans +=1
print(ans)
Reference
この問題について(円形領域(Back Jun 10000-Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@grace0st/원-영역백준-10000-파이썬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol