চেনাশোনাগুলি বিমানকে বিভক্ত করছে


23

কার্য

আপনাকে y = 0 রেখায় কেন্দ্রগুলি সহ বিমানের কয়েকটি চেনাশোনা দেওয়া হবে । এটি গ্যারান্টিযুক্ত যে কোনও চেনাশোনা জুড়ে একাধিক সাধারণ পয়েন্ট নেই।

আপনার কাজটি নির্ধারণ করা হয় যে কতগুলি অঞ্চলগুলিতে চেনাশোনাগুলি বিমানটিকে বিভক্ত করে। একটি অঞ্চল হ'ল একটি অন্তর্ভুক্তি-সর্বাধিক সংক্ষিপ্ত পয়েন্টগুলির সেট যা কোনও বৃত্তকে ছেদ না করে।

আপনার এমন একটি প্রোগ্রাম লিখতে হবে যা চেনাশোনাগুলির বিবরণ দেওয়ার সময় এই উত্তরটির সাথে তুলনা করে।


এখানে একটি উদাহরণ:

উদাহরণ 1

বাম দিকে আপনি বিমানে চেনা চেনাশোনাগুলি দেখতে পাচ্ছেন। তবে ছবির ডান অর্ধেক অংশে, চেনাশোনাগুলির দ্বারা উত্পাদিত অঞ্চলগুলি পৃথকভাবে বর্ণযুক্ত (অঞ্চল প্রতি এক রঙ)। এই উদাহরণে ছয়টি অঞ্চল রয়েছে।


ইনপুট

ইনপুটটির প্রথম লাইনে একটি সংখ্যা, Nএবং অনুসরণ করতে হবে এমন বৃত্ত বিবরণের সংখ্যা রয়েছে। এই লাইনটি isচ্ছিক, যদি আপনার সমাধানটি এটি ছাড়া কাজ করে তবে তা ঠিক।

নিম্নলিখিত Nরেখাগুলিতে প্রতিটি দুটি সংখ্যক থাকে, x i এবং r i > 0 , কেন্দ্র (x i , 0) এবং ব্যাসার্ধ r i সহ বৃত্ত উপস্থাপন করে ।

এটি গ্যারান্টিযুক্ত যে কোনও চেনাশোনা জুড়ে একাধিক সাধারণ পয়েন্ট নেই। এটি আরও গ্যারান্টিযুক্ত যে x i এবং r আমি10^9 নিখুঁত মানের চেয়ে বেশি না (তাই তারা স্বাচ্ছন্দ্যে 32-বিট পূর্ণসংখ্যায় ফিট করে)।


ইনপুটটি হতে পারে:

  • STDIN থেকে পড়ুন

  • Iবর্তমান ডিরেক্টরিতে নামের একটি ফাইল থেকে পড়ুন

বিকল্পভাবে, ইনপুটটি হতে পারে:

  • একটি গ্লোবাল ভেরিয়েবলের স্ট্রিং (নিউলাইন সহ) হিসাবে উপলব্ধ

  • স্ট্যাকের উপর


আউটপুট

এটি একক পূর্ণসংখ্যার হওয়া উচিত, উত্পাদিত অঞ্চলে সংখ্যা। এটি STDOUT বা Oবর্তমান ডিরেক্টরিতে নামের একটি ফাইলকে লেখা উচিত ।


বিধি

  • বাইটস মধ্যে সংক্ষিপ্ত কোড

  • আপনার কোডটিতে রানটাইম + স্পেস জটিলতা বহুপদী না থাকলে +200 বাইট পেনাল্টি n

  • প্রত্যাশিত রানটাইম + স্পেস জটিলতার জন্য -100 বাইট বোনাস O(n log n)

  • সবচেয়ে খারাপ ক্ষেত্রে প্রত্যাশিত রানটাইম + স্পেস জটিলতার জন্য -50 বাইট বোনাস O(n)

  • নির্ধারিত রানটাইম + স্পেস জটিলতার জন্য -100 বাইট বোনাস O(n)

রানটাইম মূল্যায়ন করার সময়:

  • ধরে নিন যে হ্যাশ টেবিলগুলি O(1)অপারেশনগুলির ক্রম এবং ইনপুট ডেটা নির্বিশেষে sertোকানো , মুছতে এবং দেখার জন্য রানটাইম প্রত্যাশা করেছে। বাস্তবায়নটি এলোমেলোকরণ ব্যবহার করে কিনা তার উপর নির্ভর করে এটি সত্য বা নাও হতে পারে।

  • ধরে নিন যে আপনার প্রোগ্রামিং ভাষার বিল্টিন সাজানোর ক্ষেত্রে নির্ধারিত O(n log n)সময় লাগে , যেখানে nইনপুট ক্রমের আকার is

  • অনুমান করুন যে ইনপুট সংখ্যায় গাণিতিক ক্রিয়াকলাপগুলি কেবলমাত্র 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


সংকেতগুলি

আমরা খুব কমপ্যাক্ট সমাধানের জন্য নিম্নলিখিত ধারণাটি ব্যবহার করতে পারি। এক্স অক্ষের সাহায্যে চেনাশোনাগুলির সেট ছেদ করতে দেয় এবং একটি প্ল্যানার গ্রাফের নোড হিসাবে ছেদ পয়েন্টগুলি ব্যাখ্যা করে:

এখানে চিত্র বর্ণনা লিখুন

প্রতিটি চেনাশোনা এই গ্রাফে ঠিক দুটি প্রান্ত এবং দুটি নোড পর্যন্ত উত্পাদন করে। মোট বাম বা ডান সীমানার স্বতন্ত্র সংখ্যার উপর নজর রাখতে আমরা একটি হ্যাশ টেবিল ব্যবহার করে নোডের সংখ্যা গণনা করতে পারি।

তারপরে গ্রাফের অঙ্কনটির মুখের সংখ্যা গণনা করতে আমরা ইউলারের বৈশিষ্ট্যযুক্ত সূত্রটি ব্যবহার করতে পারি :

V - E + F - C = 1

F = E - V + C + 1

Cসংযুক্ত উপাদানগুলির সংখ্যা গণনা করতে, আমরা গভীরতার সাথে প্রথম অনুসন্ধানটি ব্যবহার করতে পারি ।


দ্রষ্টব্য: এই সমস্যাটি ধারণাটি সাম্প্রতিক ক্রোয়েশীয় প্রোগ্রামিং প্রতিযোগিতা থেকে নেওয়া হয়েছে , তবে দয়া করে সমাধানের রূপরেখা দেখে প্রতারণা করবেন না। :)


এই বোনাসগুলির মধ্যে কিছু কি ডিকোয় হয়?
ব্যবহারকারী 2357112

@ ব্যবহারকারী 2357112 আপনি এটি প্রমাণ করতে না পারলে এটি করা যাবে না তা অনুমান করবেন না;)
নিক্লাস বি।

ঠিক আছে, কোনও যন্ত্রের পূর্ণসংখ্যায় ফিট হওয়ার গ্যারান্টিযুক্ত ইনপুটগুলির সাথে, আমরা একটি রেডিক্স সাজ্ট ব্যবহার করতে পারি এবং এটিকে ও (এন) বলতে পারি। আমি সীমিত ইনপুট আকার অনুমান করে ঘৃণা করি, কারণ কঠোরভাবে বলতে গেলে, এর অর্থ হ'ল চূড়ান্তভাবে অনেকগুলি সম্ভব ইনপুট রয়েছে।
ব্যবহারকারী 2357112

@ ব্যবহারকারী 2357112 না, আমি বলেছি আপনি অ্যাসিপটিক্সগুলি মূল্যায়ন করার সময় পূর্ণসংখ্যাকে আবদ্ধ করতে পারবেন না, সুতরাং র‌্যাডিক্স সাজ্ট বা গণনা বাছাই উভয়ই লিনিয়ার সময় এবং স্থান নয় would তারা যে কোনও শব্দের সাথে খাপ খায় তা হ'ল পাটিগণিতকে "আসল" ও (1) এবং ব্যবহারিক কারণে (বেশিরভাগ ভাষায় সীমিত পরিবর্তনশীল প্রস্থ) তৈরি করা
নিক্লাস বি।

@NiklasB। যদি আমার কাছে একটি অ্যালগরিদম থাকে যার মধ্যে সুপারলাইনার জটিলতার সাথে একমাত্র উপাদানটি বাছাই করা হয় তবে আমার ভাষাটি n log nবোনাস পাওয়ার জন্য যদি দ্রুত সাজান ব্যবহার করে তবে আমাকে মার্জ সাজানোর প্রয়োগ করতে হবে ? এছাড়াও, আমার কাছে নতুন ধারণাটি নতুন সমাধান আছে have পুরনোটির প্রতিস্থাপনের জন্য আমার কি নতুন উত্তর পোস্ট করা উচিত? (আমি যদি এর আগে আমার নতুন সমাধানটি সঠিক না হয় তবে আমি পূর্ববর্তীটিকে পছন্দ করতাম)
মার্টিন এন্ডার

উত্তর:


2

গণিত, 125 122 - 150 = -28 অক্ষর

বিল্ট-ইন ফাংশনটির জটিলতা আমি জানি না 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"]

11


আমি মনে করি যে আমরা সুরক্ষিতভাবে ধরে নিতে পারি যে ConnectedComponentsরিনিয়ার প্রত্যাশিত নিকৃষ্টতম জটিলতা রয়েছে, সুতরাং যদি ও (এন) উপাদান থাকে তবে এটি ঠিক থাকবে। আমি ম্যাথমেটিকাকে বুঝতে পারি না, সুতরাং আমি এটি বলতে পারি না এটি সামগ্রিকভাবে ও (এন) হয় এবং -150 বোনাসের জন্য যোগ্যতা অর্জন করে? আমি মনে করি এটি হয়। আমি কি কেবল এসটিডিআইএন-এ ইনপুট দিয়ে এটি চালাচ্ছি?
নিক্লাস বি।

@NiklasB। তার ইনপুট পদ্ধতিটি কেবল একটি বেনামে ফাংশনে একটি স্ট্রিং ভেরিয়েবল পাস করছে। সুতরাং আমি মনে করি যে এটি যোগ্যতা অর্জন করা উচিত। আউটপুট হিসাবে, ম্যাথমেটিকাতে এটি কেবল সংখ্যার সমাপ্তির ফলাফল হিসাবে কনসোল আউটপুট দেয়, তাই সম্ভবত খুব ভাল হওয়া উচিত।
মার্টিন ইন্ডার

আমি এর যথার্থতা যাচাই করেছি, তাই আমি মনে করি -২৮ এর স্কোর দিয়ে এই নতুন নেতা। অভিনন্দন!
নিক্লাস বি।

@NiklasB। কেন কেবল ১৫০? অ্যালগরিদমের কোন অংশে সুপারলাইনারের সবচেয়ে খারাপ জটিলতা রয়েছে?
মার্টিন ইন্ডার

@ m.buettner 150 ও (এন) প্রত্যাশিত সময়ের জন্য। নোড হিসাবে স্বেচ্ছাসেবী সংখ্যার গ্রাফের জন্য, এখানে যেমন স্পষ্টভাবে সংজ্ঞায়িত করা হয়, আপনি কেবল রৈখিক সময়ে সিসি সংখ্যা খুঁজে পাবেন না, যা সংযুক্ত উপাদানগুলির সাথে উপাদানগুলির স্বতন্ত্রতা হ্রাস করে দেখানো যেতে পারে । আমি মনে করি আমরা মূল সমস্যার সাথে উপাদানগুলির স্বতন্ত্রতাও হ্রাস করতে পারি
নিক্লাস বি।

4

রুবি - 312 306 285 273 269 259 টি অক্ষর

এই উত্তরটি আমার অন্যান্য পদ্ধতির দ্বারা ছাড়িয়ে গেছে যা যথেষ্ট কম অক্ষর ব্যবহার করে এবং এতে চলে O(n log n)

ঠিক আছে চলো যাই. প্রারম্ভিকদের জন্য, আমি কেবল একটি কার্যকর বাস্তবায়ন চেয়েছিলাম, সুতরাং এটি এখনও আলগোরিদিমত অনুকূল নয় optim আমি চেনাশোনাগুলিকে বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত বাছাই করি এবং একটি গাছ তৈরি করি (অন্যান্য চেনাশোনাগুলিতে অন্তর্ভুক্ত চেনাশোনাগুলি সেই বৃহত্তরগুলির সন্তান) উভয় অপারেশন O(n^2)সবচেয়ে খারাপ এবং O(n log n)সর্বোত্তম নেয়। তারপরে আমি গাছগুলি দিয়ে পুনরাবৃত্তি করে অঞ্চলগুলি গণনা করি। যদি কোনও বৃত্তের বাচ্চারা এর পুরো ব্যাস পূরণ করে তবে দুটি নতুন ক্ষেত্র রয়েছে, অন্যথায় কেবল একটি রয়েছে just এই পুনরাবৃত্তি গ্রহণ 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

অব্যাহত সংস্করণ (পরিবর্তনশীল ইনপুট আশা করে 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। হ্যাঁ পরীক্ষার কেসটি চমৎকার হবে। যে সম্পর্কটি আমার গাছে প্রান্তগুলি সংজ্ঞায়িত করে তা হ'ল একটি চক্রকে অন্য একটি বৃত্তে অন্তর্ভুক্ত করা। যেহেতু চেনাশোনাতে দুটি চেনাশোনাতে একে অপরকে অন্তর্ভুক্ত করা যায় না ("একটি ছেদ" শর্তের কারণে) তাই এটি কীভাবে ড্যাগ হতে পারে তা আমি দেখতে পাচ্ছি না।
মার্টিন ইন্ডার

কোনও নোডের নাতিও কি এর সন্তান?
ব্যবহারকারী 2357112 0: 05

@ ব্যবহারকারী 2357112 না, কারণ তারা কেবল তাদের সরাসরি পিতামাতাকে বিভক্ত করতে পারে
মার্টিন এেন্ডার

@NiklasB। আমি যদি আপনার প্রশ্নের উদাহরণ দিয়ে এটি চালনা করি তবে আমি পাই 11। আপনার মন্তব্যের মধ্যে একটি জন্য 9
মার্টিন ইন্ডার

@NiklasB। অপেক্ষা করুন, আমি আসলে পেয়েছি 10এবং 8আমার অদম্য সংস্করণটি পেয়েছি, 11এবং 9এবং আমার বর্তমান গল্ফযুক্ত সংস্করণ সহ: ডি
মার্টিন

2

রুবি, 203 183 173 133 - 100 = 33 টি অক্ষর

সুতরাং এখানে একটি ভিন্ন পদ্ধতির। এবার আমি চেনাশোনাগুলি তাদের বাম-সর্বাধিক বিন্দু অনুসারে বাছাই করেছি। তাদের বাম-সর্বাধিক পয়েন্টে স্পর্শ করা চেনাশোনাগুলি বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত বাছাই করা হয়। এটি লাগে O(n log n)(ভাল, রুবি দ্রুত বাছাই ব্যবহার করে, সুতরাং বাস্তবে O(n^2)তবে মার্জ / হিপ সারণি বাস্তবায়ন সম্ভবত এই চ্যালেঞ্জের আওতার বাইরে)। তারপরে আমি এই তালিকাটি নিয়ে পুনরাবৃত্তি করছি, আমি যে বৃত্তগুলিতে গিয়েছি সেগুলির সমস্ত বাম-সর্বাধিক এবং ডান-সর্বাধিক অবস্থানগুলি মনে করে। এটি আমাকে শনাক্ত করতে অনুমতি দেয় যে কোনও চেনাশোনাগুলি একটি ঘেরযুক্ত বৃহত বৃত্ত জুড়ে সমস্তভাবে সংযোগ করে। এই ক্ষেত্রে, দুটি subareas আছে, অন্যথায় কেবল একটি। এই পুনরাবৃত্তিটি কেবলমাত্র 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

অবরুদ্ধ সংস্করণ (একটি পরিবর্তনশীল ইনপুট আশা করে 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)
নিক্লাস বি।

প্রথম ব্যর্থ টেস্টকেসটি হ'ল ক্রুজনাইস / ক্রুজনিস.ইন.২ যা প্রথম "আসল" পরীক্ষার কেস তাই আমি ধরে নিই যে অ্যালগরিদম বা বাস্তবায়নের সাথে সাথে মূলত কিছু ভুল আছে। এটি নির্বিচারে নেস্টেড চেনাশোনাগুলির সাথে সঠিকভাবে কাজ করে?
নিক্লাস বি।

@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
নিক্লাস বি।

"এটি গ্যারান্টিযুক্ত যে কোনও চেনাশোনা জুড়েই একাধিক সাধারণ পয়েন্ট নেই" " সুতরাং আমার মনে হয় এটি প্রযোজ্য হবে না :)
সিসিপি

@ সিসিপি তাদের শূন্য সাধারণ পয়েন্ট রয়েছে। n=2, চেনাশোনা হয় (C=(-10,0), r=1)এবং(C=(10,0), r=1)
Niklas বি

1
এলার বৈশিষ্ট্যটি প্রয়োগ করতে গ্রাফটি সংযুক্ত থাকতে হবে না?
ব্যবহারকারী 2357112

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। ধন্যবাদ!
চার্লস

আমি ওভারল্যাপিং চেনাশোনাগুলির সাথে আরও দৃ solution় সমাধানের চেষ্টা করছিলাম .... তারপরে আমি দেখেছি যে তারা কেবলমাত্র এক পর্যায়ে ছেদ করতে পারে।
চার্লস

-1

জাভাস্ক্রিপ্ট (ES6) - 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).

সময়ের জটিলতা এখন ও (এন)।

পরীক্ষার মামলা ১

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).

মোট সময়ের জটিলতা হ'ল ও (এন.লগ (এন)) বাছাই ব্যতীত সমস্ত কিছুর জন্য ও (এন) - তবে এটি একটি বালতি সাজানোর মাধ্যমে প্রতিস্থাপন করলে এটি ও (এন) এর মোট জটিলতা হ্রাস করবে।

প্রয়োজনীয় মেমরিটি হ'ল ও (এন)।

আমার টুডু তালিকার পরবর্তী কি আছে তা অনুমান করুন ... 150 টিরও কম অক্ষরের মধ্যে বালতি সাজানো। সম্পন্ন


বাকেট সাজানোর শুধুমাত্র গড় জটিলতা রয়েছে O(n)(আসলে O(n+k)), কিন্তু O(n^2)বা O(n log n)লক বাকেট মধ্যে ব্যবহার বাছাই আলগোরিদিম উপর নির্ভর করে, তাই আপনি 50 টি অক্ষর এটা করতে প্রয়োজন চাই।
মার্টিন ইন্ডার

@ এম.বয়েটনার - ও (এন) নিকৃষ্টতম জটিলতায় বালতি বাছাই করা যেতে পারে। এটি বালতিগুলির সাবধানে পছন্দ এবং বালিকে নির্ধারিত করতে একটি হে (1) অ্যালগরিদম উপর নির্ভর করে। আমি এটি আগে করেছি (এবং এটি প্রমাণিত) এবং আমার কেবল কোডটি জাভাস্ক্রিপ্টে স্থানান্তর করতে হবে। উপরের অ্যালগরিদম ইতিমধ্যে ও (এন.লগ (এন)) রয়েছে তাই একমাত্র উন্নতি হ'ল একটি ও (এন) বাছাই করা অ্যালগরিদম পাওয়া।
এমটি0

আমি সেই প্রমাণ এবং বালতিগুলির সাথে সম্পর্কিত পছন্দের বিষয়ে আগ্রহী হব। :)
মার্টিন এন্ডার

cs.princeton.edu/~dpd/Papers/SCG-09-invited/… (556 পৃষ্ঠায়) ও (এন) বালতি সাজানোর উদাহরণ দেয়। সংরক্ষণাগার ..org/stream/PlanarityTestingByPathAddition/… (পৃষ্ঠা 75) একটি ও (এন) সম্মিলিত ডিএফএস অনুসন্ধান এবং বালতি সাজানোর উদাহরণ দেয় (সময়ের জটিলতা 76 পৃষ্ঠায় আলোচিত)।
এমটি0

1
@ এমটি 0 সেখানে ধরে রাখুন, আপনি প্রশ্নের জটিলতা বিভাগে আমার সংযোজনটি পড়তে পারেন। রৈখিক সময়ে আনবাউন্ডেড সংখ্যা বাছাই করা সুনির্দিষ্টভাবে অসম্ভব
নিক্লাস বি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.