प्लेन को विभाजित करते हुए सर्किल


23

कार्य

आपको विमान में उनके केंद्रों के साथ लाइन y = 0 पर हलकों का एक सेट दिया जाएगा । यह गारंटी दी जाती है कि किसी भी जोड़ी के घेरे में एक से अधिक सामान्य बिंदु नहीं हैं।

आपका कार्य यह निर्धारित करना है कि कितने क्षेत्र जिसमें मंडल विमान को विभाजित करते हैं। एक क्षेत्र एक समावेश-अधिकतम समसामयिक बिंदु है जो किसी भी मंडल को नहीं काटता है।

आपको एक ऐसा कार्यक्रम लिखना चाहिए जो इस उत्तर की गणना करता है जब मंडलियों का विवरण दिया जाता है।


यहाँ एक उदाहरण है:

उदाहरण 1

बाईं ओर आप विमान में खींचे गए घेरे को देखते हैं। हालांकि, चित्र के दाहिने आधे हिस्से में, हलकों द्वारा उत्पादित क्षेत्र अलग-अलग रंग के हैं (प्रति क्षेत्र एक रंग)। इस उदाहरण में छह क्षेत्र हैं।


इनपुट

इनपुट की पहली पंक्ति में एक नंबर होता है, Nसर्कल वर्णन की संख्या का पालन करने के लिए। यह लाइन वैकल्पिक है, यदि आपका समाधान इसके बिना काम करता है, तो यह ठीक है।

निम्नलिखित Nलाइनों प्रत्येक दो पूर्णांकों होते हैं, x मैं और आर मैं > 0 , केंद्र के साथ एक चक्र का प्रतिनिधित्व (एक्स मैं , 0) और त्रिज्या r मैं

यह गारंटी दी जाती है कि किसी भी जोड़ी के घेरे में एक से अधिक सामान्य बिंदु नहीं हैं। यह आगे की गारंटी है कि x i और r i10^9 निरपेक्ष मूल्य से अधिक नहीं है (इसलिए वे आराम से 32-बिट पूर्णांक में फिट होते हैं)।


इनपुट हो सकता है:

  • STDIN से पढ़ें

  • Iवर्तमान निर्देशिका में नामित फ़ाइल से पढ़ें

वैकल्पिक रूप से, इनपुट हो सकता है:

  • एक वैश्विक चर में एक स्ट्रिंग (newlines सहित) के रूप में उपलब्ध है

  • ढेर पर


उत्पादन

यह एक एकल पूर्णांक होना चाहिए, उत्पादित क्षेत्रों की संख्या। यह STDOUT या Oवर्तमान निर्देशिका में नामित फ़ाइल के लिए लिखा जाना चाहिए ।


नियम

  • बाइट्स में सबसे छोटा कोड जीतता है

  • +200 बाइट पेनल्टी यदि आपके कोड में रनटाइम नहीं है + स्पेस जटिलता बहुपद n

  • -100 बाइट बोनस सबसे खराब स्थिति की उम्मीद रनटाइम + अंतरिक्ष जटिलता के लिए O(n log n)

  • -50 बाइट बोनस सबसे खराब स्थिति की उम्मीद रनटाइम + अंतरिक्ष जटिलता के लिए O(n)

  • नियतात्मक क्रम + अंतरिक्ष जटिलता के लिए -100 बाइट बोनस O(n)

रनटाइम का आकलन करते समय:

  • मान लें कि हैश तालिकाओं ने O(1)ऑपरेशन के अनुक्रम और इनपुट डेटा की परवाह किए बिना, डालने, हटाने और देखने के लिए रनटाइम की उम्मीद की है। यह सही हो सकता है या नहीं, यह इस बात पर निर्भर करता है कि कार्यान्वयन यादृच्छिकरण का उपयोग करता है या नहीं।

  • मान लें कि आपकी प्रोग्रामिंग भाषा का बिल्टइन प्रकार नियतात्मक O(n log n)समय लेता है , जहां nइनपुट अनुक्रम का आकार है।

  • मान लें कि इनपुट संख्याओं पर अंकगणितीय संचालन में केवल O(1)समय लगता है।

  • यह मत समझो कि इनपुट नंबर एक स्थिर से बंधे हैं, हालांकि, व्यावहारिक कारणों से, वे हैं। इसका अर्थ है कि रेडिक्स सॉर्ट या काउंटिंग सॉर्ट जैसे एल्गोरिदम रैखिक समय नहीं हैं। सामान्य तौर पर, बहुत बड़े स्थिर कारकों से बचा जाना चाहिए।


उदाहरण

इनपुट:

2 
1 3
5 1

आउटपुट: 3


इनपुट:

3
2 2
1 1
3 1

आउटपुट: 5

4
7 5
-9 11
11 9
0 20

इनपुट:

9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2

आउटपुट: 11


संकेत

हम एक बहुत ही कॉम्पैक्ट समाधान के लिए निम्नलिखित विचार का उपयोग कर सकते हैं। आइए एक्स अक्ष के साथ हलकों के सेट को काटें और चौराहे के बिंदुओं की व्याख्या प्लानर ग्राफ में नोड्स के रूप में करें:

यहाँ छवि विवरण दर्ज करें

हर सर्कल इस ग्राफ में ठीक 2 किनारों और दो नोड्स तक का उत्पादन करता है। हम अलग-अलग बाएँ या दाएँ सीमाओं की कुल संख्या का ट्रैक रखने के लिए हैश तालिका का उपयोग करके नोड्स की संख्या की गणना कर सकते हैं।

फिर हम ग्राफ की रेखाचित्र के चेहरों की संख्या की गणना करने के लिए यूलर की विशेषता सूत्र का उपयोग कर सकते हैं :

V - E + F - C = 1

F = E - V + C + 1

गणना करने के लिए C, जुड़े घटकों की संख्या, हम एक गहराई-पहली खोज का उपयोग कर सकते हैं ।


नोट: यह समस्या विचार हाल ही में एक क्रोएशियाई प्रोग्रामिंग प्रतियोगिता से उधार लिया गया है , लेकिन कृपया समाधान की रूपरेखा को देखकर धोखा न दें। :)


उन बोनस decoys में से कुछ हैं?
user2357112

@ user2357112 यह मत मानो कि जब तक आप इसे साबित नहीं कर सकते, तब तक ऐसा नहीं किया जा सकता;)
निकल्स बी

खैर, मशीन के पूर्णांक में फिट होने की गारंटी के साथ, हम एक मूलांक सॉर्ट का उपयोग कर सकते हैं और इसे O (n) कह सकते हैं। मुझे प्रतिबंधित इनपुट आकार मानने से नफरत है, क्योंकि सख्ती से बोलना, इसका मतलब है कि बहुत संभव इनपुट हैं।
user2357112

@ user2357112 नहीं, मैंने कहा कि आप पूर्णांकों का आकलन नहीं कर सकते हैं जबकि अस्मिताओं का मूल्यांकन किया जा सकता है, इसलिए न तो मूलांक क्रमांक और न ही गणना प्रकार रैखिक समय और स्थान होगा। यह कि वे एक शब्द में फिट होते हैं, केवल अंकगणित को "वास्तविक" O (1) और व्यावहारिक कारणों से (अधिकांश भाषाओं में बंधी हुई चर चौड़ाई) बनाने के लिए है
Niklas B.

@NiklasB। अगर मेरे पास एक एल्गोरिथ्म है जिसमें सुपरलाइनियर जटिलता के साथ एकमात्र घटक छँटाई है, तो मुझे मर्ज सॉर्ट को लागू करना होगा यदि मेरी भाषा त्वरित सॉर्ट का उपयोग करती है, ताकि n log nबोनस मिल सके ? इसके अलावा, मेरे पास नए वैचारिक रूप से नए समाधान हैं। क्या मुझे पुराने की जगह नया उत्तर देना चाहिए? (यदि मेरा नया समाधान वास्तव में सही नहीं है तो मैं पूर्व को प्राथमिकता दूंगा)
मार्टिन एंडर

जवाबों:


2

गणितज्ञ, १२५ १२२ - १५० = -२। वर्ण

मुझे अंतर्निहित फ़ंक्शन की जटिलता का पता नहीं है ConnectedComponents

1+{-1,2,1}.Length/@{VertexList@#,EdgeList@#,ConnectedComponents@#}&@Graph[(+##)<->(#-#2)&@@@Rest@ImportString[#,"Table"]]&

उपयोग:

1+{-1,2,1}.Length/@{VertexList@#,EdgeList@#,ConnectedComponents@#}&@Graph[(+##)<->(#-#2)&@@@Rest@ImportString[#,"Table"]]&[
"9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2"]

1 1


मुझे लगता है कि हम सुरक्षित रूप से मान सकते हैं कि ConnectedComponentsरैखिक में सबसे खराब स्थिति की उम्मीद है, इसलिए यदि ओ (एन) घटक हैं, तो यह ठीक होगा। मुझे गणितज्ञ की समझ नहीं है, इसलिए मैं यह नहीं बता सकता कि क्या यह ओ (n) है और -150 बोनस के लिए योग्य है? मुझे लगता है कि यह करता है। क्या मैं इसे एसटीडीआईएन में इनपुट के साथ चला सकता हूं?
निकल्स बी।

@NiklasB। उसकी इनपुट विधि सिर्फ एक अनाम फ़ंक्शन के लिए एक स्ट्रिंग चर पास कर रही है। इसलिए मुझे लगता है कि योग्य होना चाहिए। आउटपुट के लिए, मैथेमेटिका में यह बस कंसोल आउटपुट में समाप्त होने वाली संख्या के परिणामस्वरूप होगा, ताकि संभवतः ठीक भी हो।
मार्टिन एंडर

मैंने इसकी शुद्धता को सत्यापित किया है, इसलिए मुझे लगता है कि -28 के स्कोर के साथ यह नया नेता है। बधाई हो!
निकल्स बी।

@NiklasB। केवल 150 ही क्यों? एल्गोरिथ्म के किस हिस्से में सुपरलाइनियर सबसे खराब स्थिति है?
मार्टिन एंडर

@ m.buettner 150 O (n) अपेक्षित समय के लिए है। नोड्स के रूप में मनमाने ढंग से संख्याओं के साथ रेखांकन के लिए, जैसा कि यहाँ स्पष्ट रूप से परिभाषित किया गया है, आप बस रेखीय समय में सीसी की संख्या नहीं पा सकते हैं, जो कि जुड़े घटकों के लिए तत्व भिन्नता को कम करके दिखाया जा सकता है । मुझे लगता है कि हम मूल समस्या के लिए तत्व विशिष्टता को भी कम कर सकते हैं
निकल्स बी।

4

रूबी - 312 306 285 273 269 259 वर्ण

यह उत्तर मेरे अन्य दृष्टिकोण से अलग हो गया है जो काफी कम पात्रों का उपयोग करता है और अंदर चलता है O(n log n)

ठीक है चलो चलते हैं। शुरुआत के लिए, मैं सिर्फ एक कार्यशील कार्यान्वयन चाहता था, इसलिए यह एल्गोरिदम अभी तक अनुकूलित नहीं है। मैं सबसे बड़े से लेकर सबसे छोटे तक के हलकों को छांटता हूं और एक पेड़ बनाता हूं (अन्य सर्कल में शामिल सर्कल उन बड़े लोगों के बच्चे हैं)। दोनों ऑपरेशन O(n^2)सबसे खराब और O(n log n)सबसे अच्छे तरीके से होते हैं। फिर मैं क्षेत्रों को गिनने के लिए पेड़ के माध्यम से पुनरावृति करता हूं। यदि एक सर्कल के बच्चे इसके पूरे व्यास को भरते हैं, तो दो नए क्षेत्र हैं, अन्यथा बस एक है। यह चलना O(n)। इसलिए मेरे पास समग्र जटिलता है O(n^2)और न तो इनाम और न ही दंड के लिए योग्य हैं।

यह कोड एक चर में संग्रहीत किए जाने वाले मंडलियों की संख्या के बिना इनपुट की अपेक्षा करता है s:

t=[]
s.lines.map{|x|x,r=x.split.map &:to_i;{d:2*r,l:x-r,c:[]}}.sort_by!{|c|-c[:d]}.map{|c|i=-1;n=t
while o=n[i+=1]
if 0>d=c[:l]-o[:l]
break
elsif o[:d]>d
n=o[:c]
i=-1
end
end
n[i,0]=c}
a=1
t.map &(b=->n{d=0
n[:c].each{|c|d+=c[:d]}.map &b
a+=d==n[:d]?2:1})
p a

Ungolfed संस्करण (चर में इनपुट की अपेक्षा करता है string):

list = []
string.split("\n").map { |x|
  m = x.split
  x,radius = m.map &:to_i
  list<<{x:x, d:2*radius, l:x-radius, r:x+radius, children:[]}
}
list.sort_by! { |circle| -circle[:d] }
tree = []
list.map { |circle|
  i = -1
  node = tree
  while c=node[i+=1]
    if circle[:x]<c[:l]
      break
    elsif circle[:x]<c[:r]
      node = c[:children]
      i = -1
    end
  end
  node[i,0] = circle
}
areas = 1
tree.map &(count = -> node {
  d = 0
  i = -1
  while c=node[:children][i+=1]
    count.call c
    d += c[:d]
  end
  areas += d == node[:d] ? 2 : 1
})
p areas

@NiklasB। हाँ, यह परीक्षण का मामला अच्छा होगा। मेरे पेड़ में किनारों को परिभाषित करने वाला संबंध बस एक सर्कल को दूसरे में शामिल करना है। चूंकि सर्कल में दो सर्किलों को शामिल नहीं किया जा सकता है, जिसमें एक-दूसरे ("एक चौराहे" की स्थिति के कारण) शामिल नहीं है, मैं यह नहीं देखता कि यह डीएजी कैसे हो सकता है।
मार्टिन एंडर

एक नोड के पोते भी अपने बच्चे हैं?
user2357112

@ user2357112 नहीं, क्योंकि वे केवल अपने सीधे माता
मार्टिन

@NiklasB। यदि मैं इसे आपके प्रश्न में उदाहरण के साथ चलाता हूं, तो मुझे मिल जाएगा 11। अपनी टिप्पणी में एक के लिए 9
मार्टिन एंडर

@NiklasB। रुकिए, मैं वास्तव में मिलता है 10और 8मेरी ungolfed संस्करण के साथ है, लेकिन 11और 9मेरे वर्तमान golfed संस्करण के साथ: डी
मार्टिन Ender

2

रूबी, 203 183 173 133 - 100 = 33 वर्ण

तो यहाँ एक अलग दृष्टिकोण है। इस बार, मैं हलकों को उनके सबसे बाएं बिंदु से छांटता हूं। उनके बाएं-सबसे बिंदु पर स्पर्श करने वाले मंडल सबसे बड़े से लेकर सबसे छोटे तक छांटे जाते हैं। यह O(n log n)(ठीक है, रूबी त्वरित प्रकार का उपयोग करता है, इसलिए वास्तव में O(n^2)लेकिन मर्ज / हीप प्रकार को लागू करना शायद इस चुनौती के दायरे से परे है)। फिर मैंने इस सूची पर पुनरावृति की, मेरे द्वारा देखी गई मंडलियों के सभी बाएं-सबसे और दाएं-सबसे पदों को याद करते हुए। यह मुझे पता लगाने की अनुमति देता है कि क्या मंडलियों की एक श्रृंखला पूरे रास्ते को एक बड़े वृत्त के चारों ओर जोड़ती है। इस मामले में, दो पनडुब्बी हैं, अन्यथा सिर्फ एक। यह पुनरावृत्ति केवल O(n)कुल जटिलता प्रदान करती है, O(n log n)जिसमें से 100 वर्ण इनाम के लिए योग्य हैं।

यह स्निपेट आदेशों की संख्या के बिना कमांड-लाइन तर्कों में एक फ़ाइल के माध्यम से दिए जाने वाले इनपुट की उम्मीद करता है :

l,r={},{}
a=1
$<.map{|x|c,q=x.split.map &:to_r;[c-q,-2*q]}.sort.map{|x,y|a+=r[y=x-y]&&l[x]?2:1
l[y]=1 if l[x]&&!r[y]
l[x]=r[y]=1}
p a

Ungolfed संस्करण (एक चर में इनपुट की उम्मीद करता है string):

list = []
string.split("\n").map { |x|
  m = x.split
  x,radius = m.map &:to_r
  list<<{x:x, d:2*radius, l:x-radius, r:x+radius}
}
list.sort_by! { |circle| circle[:l] + 1/circle[:d] }
l,r={},{}
areas = 1
list.map { |circle|
  x,y=circle[:l],circle[:r]
  if l[x] && r[y]
    areas += 2
  else
    areas += 1
    l[y]=1 if l[x]
  end
  r[y]=1
  l[x]=1
}
p areas

दुर्भाग्य से यह सभी बड़े टेस्टकेस के लिए विफल रहता है। हालांकि यह तेज़ है;) मेरे पास इस समय एक छोटा सा असफल उदाहरण नहीं है, लेकिन आप जिस प्रतियोगिता वेबसाइट से मैं जुड़ा हुआ है, उस पर परीक्षण डेटा पा सकते हैं (यह # 6 प्रतियोगिता है)
निकल्स बी

पहला असफल परीक्षणकेस kruznice / kruznice.in.2 है जो पहला "वास्तविक" परीक्षण मामला है, इसलिए मुझे लगता है कि एल्गोरिथ्म या कार्यान्वयन में कुछ मौलिक गलत है। क्या यह मनमाने ढंग से नेस्टेड सर्कल के साथ सही काम करता है?
निकलेस बी।

@NiklasB। धन्यवाद, मैं परीक्षण के मामलों में एक नज़र डालूंगा (मुझे इसे ठीक करने के लिए कल रात तक ले जा सकता है)
मार्टिन एंडर

@NiklasB। मुझे समस्या का पता चला और न्यूनतम असफल उदाहरण के लिए 5 हलकों की आवश्यकता है -1 1 1 1 0 2 4 2 0 6:। मैं कल रात (उम्मीद) द्वारा इसे ठीक करने के बारे में सोचूंगा।
मार्टिन एंडर

आपकी जटिलता विश्लेषण लगता है कि साहचर्य सरणी का उपयोग निरंतर समय है। ऐसा लगता है कि सबसे खराब स्थिति में सच होने की संभावना नहीं है।
पीटर टेलर

1

जूलिया - 260 -100 (बोनस?) = 160

सर्कल को कोने (चौराहों), किनारों, और चेहरे (विमान के क्षेत्रों) के रूप में व्याख्या करते हुए हम यूलर विशेषता का उपयोग करके एक दूसरे से संबंधित कर सकते हैं , इसलिए हमें केवल "कोने" और "किनारों" की संख्या जानने की आवश्यकता है। "चेहरे" या नीचे लिखे सूत्र के साथ विमान के क्षेत्र:यूलर की विशेषता

अद्यतन: कुछ समय के लिए मैंने सोचा कि मेरी पद्धति के साथ समस्या केवल तब थी जब हलकों को नहीं जोड़ा गया था, इसलिए मैं एक विचार के साथ आया, कृत्रिम रूप से उन्हें क्यों नहीं जोड़ा गया? तो पूरा यूलर फार्मूले को पूरा करेगा।

सर्किल उदाहरण

एफ = 2 + ईवी (वी = 6, ई = 9)

[नीडेड सर्कल के साथ काम न करें, इसलिए यह सामान्य मामलों के लिए समस्या का जवाब नहीं है]

कोड :

s=readlines(open("s"))
n=int(s[1])
c=zeros(n,2)
t=[]
for i=1:n
    a=int(split(s[i+1]))
    c[i,1]=a[1]-a[2]
    c[i,2]=a[1]+a[2]
    if i==1 t=[c[1]]end
    append!(t,[c[i,1]:.5:c[i,2]])
end
e=0
t=sort(t)
for i in 1:(length(t)-1) e+=t[i+1]-t[i]>=1?1:0end #adds one edge for every gap
2+2n+e-length(unique(c)) # 2+E-V = 2+(2n+e)-#vertices

मुझे लगता है कि आपका कार्यक्रम विफल हो जाएगा 2 -10 1 10 1
निकल्स बी।

"यह गारंटी दी जाती है कि किसी भी जोड़े के पास एक से अधिक सामान्य बिंदु नहीं हैं।" इसलिए मुझे लगता है कि यह लागू नहीं होगा :)
CCP

@ CCP उनके पास शून्य सामान्य अंक हैं। n=2मंडलियां हैं (C=(-10,0), r=1)और(C=(10,0), r=1)
निकल्स बी।

1
क्या यूलर की विशेषता को लागू करने के लिए ग्राफ को जोड़ना नहीं है?
user2357112

1
आह, यहाँ एक सरल मामला है: 4 0 2 1 1 10 2 11 1लेकिन मुझे नहीं लगता कि मैं आपको बहुत अधिक परीक्षण के मामले दे सकता हूं, यह थोड़ा अनुचित होगा
निकल्स बी।

1

स्पाइडरमोंकी जेएस, 308, 287 , 273 - 100 = 173

मुझे लगता है कि अगर मैं रूबी या पायथन में इसे फिर से लिखता हूं तो मैं पात्रों को बचा सकता था।

कोड:

for(a=[d=readline],e={},u=d(n=1);u--;)[r,q]=d().split(' '),l=r-q,r-=-q,e[l]=e[l]||[0,0],e[r]=e[r]||[0,0],e[r][1]++,e[l][0]++
for(k=Object.keys(e).sort(function(a,b)b-a);i=k.pop();a.length&&a.pop()&a.push(0)){for([l,r]=e[i];r--;)n+=a.pop()
for(n+=l;l--;)a.push(l>0)}print(n)

कलन विधि:

n = 1 // this will be the total
e = {x:[numLeftBounds,numRightBounds]} // imagine this as the x axis with a count of zero-crossings
a = [] // this is the stack of circles around the "cursor".  
       // values will be 1 if that circle's never had alone time, else 0
k = sort keys of e on x
for each key in k: // this is the "cursor"
  n += key[numLeftBounds] // each circle that opens has at least one space.
  k[numRightBounds].times {n += a.pop()} // pop the closing circles. if any were never alone, add 1
  k[numLeftBounds].times {a.push(alwaysAlone)} // push the opening circles
  if !a.empty():
     set the innermost circle (top of stack) to false (not never alone)
  fi
loop

मैं बड़े ओ नोटेशन पर बहुत अच्छा नहीं हूं, लेकिन मुझे लगता है कि मैं ओ (एन) हूं क्योंकि मैं प्रत्येक सर्कल के माध्यम से 3 बार प्रभावी रूप से लूप कर रहा हूं (बनाएं, बाएं, दाएं) और मैप की कुंजी भी सॉर्ट कर रहा हूं (और मैं ओ के लिए सॉर्ट करता हूं) n लॉग एन) लेकिन वह गायब हो जाता है)। क्या यह निर्धारक है?


अगर किसी को किसी भी बयान में rलूप और लूप को संयोजित करने के बारे में कोई सलाह है l, तो मैं इसकी सराहना करूंगा।
नहीं कि चार्ल्स

चीयर्स :) मुझे लगता है कि आपका रनटाइम वास्तव में ओ (एन लॉग एन) है, इस प्रकार के कारण, जो -100 होगा। मैं आपको बता दूंगा कि क्या यह सभी परीक्षण मामलों से गुजरता है।
निकल्स बी।

अच्छा है, आपका कार्यक्रम पहली कोशिश में सभी परीक्षण मामलों से गुजरता है। मुझे लगता है कि इस तरह से कुछ (कुछ स्टैक में बनाए गए राज्य के साथ स्वीपलाइन) समस्या लेखकों का आधिकारिक समाधान था। आपके कार्यक्रम को 173 का कुल स्कोर
निकल्स बी।

@NiklasB। धन्यवाद!
नहीं

मैं अतिव्यापी हलकों के साथ एक बहुत अधिक मजबूत समाधान की कोशिश कर रहा था .... फिर मैंने देखा कि वे केवल एक बिंदु पर अंतर कर सकते हैं।
नहीं कि चार्ल्स

-1

जावास्क्रिप्ट (ईएस 6) - 255 254 वर्ण - 100 250 बोनस = 155 4

R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

मान लेता है कि इनपुट स्ट्रिंग चर में है Sऔर कंसोल के लिए क्षेत्रों की संख्या को आउटपुट करता है।

R=/(\S+) (\S+)/ym;                  // Regular expression to find centre and width.
N=1;                                // Number of regions
w=l=0;                              // Maximum width and minimum left boundary.
X=[];                               // A 1-indexed array to contain the circles.
                                    // All the above are O(1)
for(;m=R.exec(S);){                 // For each circle
    X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};
                                    // Create an object with w (width), l (left boundary)
                                    // and r (right boundary) attributes.
    l=k<l?k:l;                      // Update the minimum left boundary.
    w=j<w?w:j                       // Update the maximum width.
}                                   // O(1) per iteration = O(N) total.
M=[];                               // An array.
X.map(x=>M[(x.l-l+1)*w-x.w]=x);     // Map the 1-indexed array of circles (X) to a
                                    // sparse array indexed so that the elements are
                                    // sorted by ascending left boundary then descending
                                    // width.
                                    // If there are N circles then only N elements are
                                    // created in the array and it can be treated as if it
                                    // is a hashmap (associative array) with a built in
                                    // ordering and as per the rules set in the question
                                    // is O(1) per insert so is O(N) total cost.
                                    // Since the array is sparse then it is still O(N)
                                    // total memory.
s=[];                               // An empty stack
i=0;                                // The number of circles on the stack.
M.map(x=>{                          // Loop through each circle
    while(i&&s[i-1][1]<x[1])        // Check to see if the current circle  is to the right
                                    // of the circles on the stack;
      N+=s[--i][0]?0:1;             // if so, decrement the length of the stack and if the
                                    // circle that pops off has radius equal to the total
                                    // radii of its children then increment the number of
                                    // regions by 1.

                                    // Since there can be at most N items on the stack then
                                    // there can be at most N items popped off the stack
                                    // over all the iterations; therefore this operation
                                    // has an O(N) total cost.
    i&&(s[i-1][0]-=x[0]);           // If there is a circle on the stack then this circle
                                    // is its child. Decrement the parent's radius by the
                                    // current child's radius.
                                    // O(1) per iteration
    s[i++]=x                        // Add the current circle to the stack.
  });
while(i)N+=s[--i][0]?0:1            // Finally, remove all the remaining circles from the
                                    // stack and if the circle that pops off has radius
                                    // equal to the total radii of its children then
                                    // increment the number of regions by 1.
                                    // Since there will always be at least one circle on the
                                    // stack then this has the added bonus of being the final
                                    // command so the value of N is printed to the console.
                                    // As per the previous comment on the complexity, there
                                    // can be at most N items on the stack so between this
                                    // and the iterations over the circles then there can only
                                    // be N items popped off the stack so the complexity of
                                    // all these tests on the circles on the stack is O(N).

समय जटिलता अब ओ (एन) है।

टेस्ट केस 1

S='2\n1 3\n5 1';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

आउटपुट: 3

टेस्ट केस 2

S='3\n2 2\n1 1\n3 1';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

आउटपुट: 5

टेस्ट केस 3

S='4\n7 5\n-9 11\n11 9\n0 20';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

आउटपुट: 6

टेस्ट केस 4

S='9\n38 14\n-60 40\n73 19\n0 100\n98 2\n-15 5\n39 15\n-38 62\n94 2';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

आउटपुट: 11

टेस्ट केस 5

S='87\n-730 4\n-836 2\n-889 1\n-913 15\n-883 5\n-908 8\n-507 77\n-922 2\n-786 2\n-782 2\n-762 22\n-776 2\n-781 3\n-913 3\n-830 2\n-756 4\n-970 30\n-755 5\n-494 506\n-854 4\n15 3\n-914 2\n-840 2\n-833 1\n-505 75\n-888 10\n-856 2\n-503 73\n-745 3\n-903 25\n-897 1\n-896 2\n-848 10\n-878 50\n-864 2\n0 1000\n-934 6\n-792 4\n-271 153\n-917 1\n-891 3\n-833 107\n-847 3\n-758 2\n-754 2\n-892 2\n-738 2\n-876 2\n-52 64\n-882 2\n-270 154\n-763 3\n-868 72\n-846 4\n-427 3\n-771 3\n-767 17\n-852 2\n-765 1\n-772 6\n-831 1\n-582 2\n-910 6\n-772 12\n-764 2\n-907 9\n-909 7\n-578 2\n-872 2\n-848 2\n-528 412\n-731 3\n-879 1\n-862 4\n-909 1\n16 4\n-779 1\n-654 68\n510 490\n-921 3\n-773 5\n-653 69\n-926 2\n-737 3\n-919 1\n-841 1\n-863 3';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

आउटपुट: 105

पुराना वर्जन

C=S.split('\n');N=1+C.shift()*1;s=[];C.map(x=>x.split(' ')).map(x=>[w=x[1]*1,x[i=0]*1+w]).sort((a,b)=>(c=a[1]-2*a[0])==(d=b[1]-2*b[0])?b[0]-a[0]:c-d).map(x=>{while(i&&s[i-1][1]<x[1])N+=s[--i][0]?0:1;i&&(s[i-1][0]-=x[0]);s[i++]=x});while(i)N+=s[--i][0]?0:1

टिप्पणियों के साथ:

C=S.split('\n');                    // Split the input into an array on the newlines.
                                    // O(N)
N=1+C.shift()*1;                    // Remove the head of the array and store the value as
                                    // if there are N disjoint circles then there will be
                                    // N+1 regions.
                                    // At worst O(N) depending on how .shift() works.
s=[];                               // Initialise an empty stack.
                                    // O(1)
C .map(x=>x.split(' '))             // Split each line into an array of the two values.
                                    // O(1) per line = O(N) total.
  .map(x=>[w=x[1]*1,x[i=0]*1+w])    // Re-map the split values to an array storing the
                                    // radius and the right boundary.
                                    // O(1) per line = O(N) total.

  .sort((a,b)=>(c=a[1]-2*a[0])==(d=b[1]-2*b[0])?b[0]-a[0]:c-d)
                                    // Sort the circles on increasing left boundary and
                                    // then descending radius.
                                    // O(1) per comparison = O(N.log(N)) total.
  .map(x=>{                         // Loop through each circle
    while(i&&s[i-1][1]<x[1])        // Check to see if the current circle  is to the right
                                    // of the circles on the stack;
      N+=s[--i][0]?0:1;             // if so, decrement the length of the stack and if the
                                    // circle that pops off has radius equal to the total
                                    // radii of its children then increment the number of
                                    // regions by 1.

                                    // Since there can be at most N items on the stack then
                                    // there can be at most N items popped off the stack
                                    // over all the iterations; therefore this operation
                                    // has an O(N) total cost.
    i&&(s[i-1][0]-=x[0]);           // If there is a circle on the stack then this circle
                                    // is its child. Decrement the parent's radius by the
                                    // current child's radius.
                                    // O(1) per iteration
    s[i++]=x                        // Add the current circle to the stack.
  });
while(i)N+=s[--i][0]?0:1            // Finally, remove all the remaining circles from the
                                    // stack and if the circle that pops off has radius
                                    // equal to the total radii of its children then
                                    // increment the number of regions by 1.
                                    // Since there will always be at least one circle on the
                                    // stack then this has the added bonus of being the final
                                    // command so the value of N is printed to the console.
                                    // As per the previous comment on the complexity, there
                                    // can be at most N items on the stack so between this
                                    // and the iterations over the circles then there can only
                                    // be N items popped off the stack so the complexity of
                                    // all these tests on the circles on the stack is O(N).

कुल समय जटिलता O (N) है, जो O (N.log (N)) को छोड़कर हर चीज के लिए है - हालाँकि इसे एक बाल्टी सॉर्ट के साथ बदलने पर, यह O (N) की कुल जटिलता को कम कर देगा।

आवश्यक मेमोरी O (N) है।

लगता है कि मेरी टूडू सूची में आगे क्या है ... 150 से कम अक्षरों में बाल्टी सॉर्ट। किया हुआ


बाल्टी सॉर्ट में केवल औसत जटिलता है O(n)(वास्तव में O(n+k)), लेकिन O(n^2)या O(n log n)सबसे खराब स्थिति बाल्टी के भीतर उपयोग किए जाने वाले सॉर्टिंग एल्गोरिदम पर निर्भर करती है, इसलिए आपको इसे 50 वर्णों में करना होगा।
मार्टिन एंडर

@ m.buettner - बाल्टी सॉर्ट ओ (एन) सबसे खराब स्थिति में किया जा सकता है। यह बाल्टी की सावधानीपूर्वक पसंद पर निर्भर करता है और बाल्टी को आवंटित करने के लिए एक (1) एल्गोरिथ्म है। मैंने इसे पहले किया है (और इसे साबित किया है) और मुझे सिर्फ जावास्क्रिप्ट में कोड को स्थानांतरित करने की आवश्यकता है। ऊपर दिया गया एल्गोरिथ्म पहले से ही O (N.log (N)) है, इसलिए O (N) सॉर्टिंग एल्गोरिदम प्राप्त करने के लिए एकमात्र सुधार है।
MT0

मैं उस सबूत और बाल्टी के इसी विकल्प में दिलचस्पी लूंगा। :)
मार्टिन एंडर

cs.princeton.edu/~dpd/Papers/SCG-09-invited/… (पृष्ठ 556 पर) एक O (N) बाल्टी प्रकार का उदाहरण देता है। आर्काइव.ऑर्ग / स्ट्रीम /PlanarityTestingByPathAddition/… (पेज 75) एक O (N) संयुक्त DFS खोज और बकेट सॉर्ट का उदाहरण देता है (समय जटिलता पृष्ठ 76 पर चर्चा की गई है)।
MT0

1
@ Mt0 वहाँ पर है, तो आप प्रश्न के जटिलता अनुभाग के अलावा मेरे पढ़ने के लिए कर सकते हैं। निर्बाध संख्या के साथ रैखिक समय में छंटनी सबसे निश्चित रूप से असंभव है
निकल्स बी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.