CF 600 D объяснения

Решение задачи CF600D

Название буквально означает

       Дает неориентированный граф, это требование гармоничного фигура гармонии определяет, что если А до С (A <B <C) дороги, то В к С также является способом. Ряд данных 2e5

Тогда мы поняли, что если все элементы подмножества непрерывно, то это подмножество гармонии, потому что связный граф, любые две точки могут быть достигнуты. Если подмножество элементов не является непрерывным, то вы, конечно, нужно иметь несколько путей или даже пойти в другую подгруппу. Эти два примера иллюстрируют приведенные:

 

 

 

 

 

Тогда становится вопрос о том, как иметь дело с.

Я использую непересекающиеся-набор, для точки крепления, которые включены в небольшой до точки, а затем обновить размер массива Maxx массива (размер [I] используется для записи числа я установлен в это время, для записи множества Maxx максимум)

Тогда мы можем судить очень приятно, если Maxx [я] - я + 1 == размер [я], то это гармония этой коллекции, то есть, не нужно подключать к внешнему краю.

Тогда для условия не удовлетворены, как с этим бороться?

Очень простой обход я + 1 MaXX [I], о необходимости объединить входящий набор комбинированных может, в этом процессе, Maxx [я] всегда обновляются, сложность этой идеи О (п), очень элегантно.

 Наконец положил новобранец код

1 #include <stdio.h>
 2 #include <Алгоритм>
 3 с  использованием  пространства имен STD;
4  Const  INT N = 2e5 + 10 ;
5  INT фа [Н], Maxx [N], размер [N];
6  INT находка ( INT х) // 并查集基本操作
7  {
 8 ,      если (х == фа [х]) возвращение х;
9      возврата фа [х] = найти (фа [х]);
10  }
 11  INT основных ()
 12  {
 13      INT х, у, Рх, Ру;
14     INT п, т, разреш = 0 ;
15      зсапЕ ( " % d% d " , & п, & м);
16      для ( Int I = 1 ; я <= п; я ++)   // 并查集的初始化
17      {
 18          фа [г] = I;
19          Maxx [I] = I;
20          размера [I] = 1 ;
21      }
 22      для ( Int I = 1 ; я <= м; я ++ )
 23      {
 24          зсапЕ ( "% d% d " , & х, & у);
 25          // 判断然后建里并查集
26          FX = найти (х); FY = найти (у);
 27 ,          если (FX < FY)
 28          {
 29              фа [FY ] = FX;
 30              размер [FX] + = размер [FY];
 31              Maxx [FX] = макс (Maxx [FX], Maxx [FY]);
 32          } иначе ,  если (FY < FX) {
 33              фа [FX] = FY;
 34              размер [FY] + = размер [FX];
 35              Maxx [FY] =макс (Maxx [FX], Maxx [FY]);
 36          }
 37 [      }
 38      для ( INT = I 1. , я <= п;)
 39      {
 40          ПЧ (ФА [I] == I) // это определяется не быть является   
41          {
 42              // удовлетворяет условию 
43              ПЧ (размер [I] == Maxx [I] -i + 1. ) + I = размер [I];
 44              остальное {
 45                  // не удовлетворяет условию 
46                  для ( INT J = + I . 1 , J <= Maxx [I]; j ++ )
 47                 {
 48                      // динамически обновлять ответ ++ 
49                      ЕСЛИ (Найти (J) =! I)
 , 50                      {
 51                          FA [J] = I,
 52                          размер [I] + = размер [Дж];
 53                          Maxx [I] = тах ( Maxx [I] Maxx [J]);
 54                          РЭС ++ ;
 55                      }
 56                  }
 57              }
 58          }
 59      }
 60      Е ( " % D \ n- " , РЭС);
61      
62 }

 

 

 

 

 

 

 

 

рекомендация

отwww.cnblogs.com/loenvom/p/11876002.html