<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5</id>
	<title>Бинарный поиск в интервале - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5"/>
	<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5&amp;action=history"/>
	<updated>2026-05-13T11:43:16Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://acm.khpnets.info/w39/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5&amp;diff=2489&amp;oldid=prev</id>
		<title>Ctrlalt: Новая страница: «В основной статье мы рассмотрели, как писать бинарный поиск до двух эле…»</title>
		<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA_%D0%B2_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB%D0%B5&amp;diff=2489&amp;oldid=prev"/>
		<updated>2020-02-15T10:49:37Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «В &lt;a href=&quot;/wiki/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA&quot; title=&quot;Бинарный поиск&quot;&gt;основной статье&lt;/a&gt; мы рассмотрели, как писать бинарный поиск до двух эле…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;В [[Бинарный поиск|основной статье]] мы рассмотрели, как писать бинарный поиск до двух элементов и проверять их отдельно. Эту реализацию при желании можно оптимизировать.&lt;br /&gt;
&lt;br /&gt;
Варианты задачи:&lt;br /&gt;
# Массив a[] отсортирован так, что функция f(a[i]) возвращает сначала true, затем false. Нужно найти последний элемент, для которого f(a[i]) == true;&lt;br /&gt;
# Массив a[] отсортирован так, что функция f(a[i]) возвращает сначала false, затем true. Нужно найти первый элемент, для которого f(a[i]) == true.&lt;br /&gt;
&lt;br /&gt;
Правила:&lt;br /&gt;
* Поиск производится не в отрезке [l; r], а в &amp;#039;&amp;#039;&amp;#039;интервале&amp;#039;&amp;#039;&amp;#039; (l; r). Начальные значения: l = -1, r = size. Считаем, что начальный l даёт true, начальный r — false (или наоборот, в зависимости от варианта задачи);&lt;br /&gt;
* Поиск всегда осуществляется до двух элементов (while (l + 1 &amp;lt; r)). Между этими элементами будет проходить граница true и false (false и true);&lt;br /&gt;
* После проверки среднего элемента границы всегда смещаются только на середину (l = m или r = m, никаких плюс-минус единиц);&lt;br /&gt;
* Смещение границ должно происходить так, чтобы не потерять искомый элемент;&lt;br /&gt;
* Когда цикл завершится, если мы искали последний элемент, то нам нужен l, если первый — то r. Здесь нужно проверить, что l или r не равен -1 или size. В ряде случаев нужно проверить, что для выбранного элемента выполняется некоторое условие (например, мы искали первый элемент, равный x, а найдём первый элемент, больший или равный x, и равенство нужно проверить отдельно).&lt;br /&gt;
&lt;br /&gt;
Первый вариант задачи:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 // f() возвращает &lt;br /&gt;
 // сначала true, потом false&lt;br /&gt;
 // последний f() == true&lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (f(a[m]))&lt;br /&gt;
         l = m;&lt;br /&gt;
     else&lt;br /&gt;
         r = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (l != -1)&lt;br /&gt;
     return l;&lt;br /&gt;
 return -1;&lt;br /&gt;
|&lt;br /&gt;
 // сорт. по неубыванию&lt;br /&gt;
 // последний элемент &amp;lt; x&lt;br /&gt;
 &lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (a[m] &amp;lt; x)&lt;br /&gt;
         l = m;&lt;br /&gt;
     else&lt;br /&gt;
         r = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (l != -1)&lt;br /&gt;
     return l;&lt;br /&gt;
 return -1;&lt;br /&gt;
|&lt;br /&gt;
 // сорт. по неубыванию&lt;br /&gt;
 // последний элемент &amp;lt;= x&lt;br /&gt;
 &lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (a[m] &amp;lt;= x)&lt;br /&gt;
         l = m;&lt;br /&gt;
     else&lt;br /&gt;
         r = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (l != -1)&lt;br /&gt;
     return l;&lt;br /&gt;
 return -1;&lt;br /&gt;
|&lt;br /&gt;
 // сорт. по неубыванию&lt;br /&gt;
 // последний элемент == x&lt;br /&gt;
 &lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (a[m] &amp;lt;= x)&lt;br /&gt;
         l = m;&lt;br /&gt;
     else&lt;br /&gt;
         r = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (l != -1 &amp;amp;&amp;amp; a[l] == x)&lt;br /&gt;
     return l;&lt;br /&gt;
 return -1;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Второй вариант задачи:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 // f() возвращает &lt;br /&gt;
 // сначала false, потом true&lt;br /&gt;
 // первый f() == true&lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (f(a[m]))&lt;br /&gt;
         r = m;&lt;br /&gt;
     else&lt;br /&gt;
         l = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (r != size)&lt;br /&gt;
     return r;&lt;br /&gt;
 return -1;&lt;br /&gt;
|&lt;br /&gt;
 // сорт. по неубыванию&lt;br /&gt;
 // первый элемент &amp;gt; x&lt;br /&gt;
 &lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (a[m] &amp;gt; x)&lt;br /&gt;
         r = m;&lt;br /&gt;
     else&lt;br /&gt;
         l = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (r != size)&lt;br /&gt;
     return r;&lt;br /&gt;
 return -1;&lt;br /&gt;
|&lt;br /&gt;
 // сорт. по неубыванию&lt;br /&gt;
 // первый элемент &amp;gt;= x&lt;br /&gt;
 &lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (a[m] &amp;gt;= x)&lt;br /&gt;
         r = m;&lt;br /&gt;
     else&lt;br /&gt;
         l = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (r != size)&lt;br /&gt;
     return r;&lt;br /&gt;
 return -1;&lt;br /&gt;
|&lt;br /&gt;
 // сорт. по неубыванию&lt;br /&gt;
 // первый элемент == x&lt;br /&gt;
 &lt;br /&gt;
 int l = -1, r = size;&lt;br /&gt;
 while (l + 1 &amp;lt; r) {&lt;br /&gt;
     int m = l + (r - l) / 2;&lt;br /&gt;
     if (a[m] &amp;gt;= x)&lt;br /&gt;
         r = m;&lt;br /&gt;
     else&lt;br /&gt;
         l = m;&lt;br /&gt;
 }&lt;br /&gt;
 if (r != size &amp;amp;&amp;amp; a[r] == x)&lt;br /&gt;
     return r;&lt;br /&gt;
 return -1;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [http://algorithmica.org/tg/binary-search algorithmica.org — Бинарный поиск]&lt;br /&gt;
* [http://github.com/petr-kalinin/progtexts/releases/download/v2014.11.01/07_binsearch.pdf Калинин П. &amp;amp;mdash; Двоичный поиск]&lt;/div&gt;</summary>
		<author><name>Ctrlalt</name></author>
	</entry>
</feed>