Xətti şəbəkə#10455

Xətti şəbəkə (Həll təhlili)

Kompüterlər -dən -ə qədər nömrələnib. Çünki n \le 10^9, işləyən və xarab olan kompüterlərin vəziyyəti haqqında məlumatı map<int, int> m xəritəsində saxlayacağıq. Əgər m[i] = 0 olarsa, deməli nömrəli kompüter işləyir, və m[i] = 1 olarsa, o xarabdır. Əvvəlcə bütün 1 \le i \le n üçün m[i] = 0 deyək.

Asanlıq üçün və n + 1 nömrəli iki uydurma xarab kompüter daxil edək. Onlar üçün m[0] = m[n + 1] = 1 olsun.

Şəbəkədə kompüter qruplarının sayını dəyişəni ilə saxlayacağıq. Əvvəlcə şəbəkədə bir qrup var, ona görə cnt = 1 qoyaq.

İndi sorğuların işlənmə prosesini nəzərdən keçirək. Xüsusilə, nömrəli bir kompüterin xarab olma halını (t = 1 tipli sorğu):

t = 2 tipli sorğunun işlənməsi üçün cari dəyişəninin dəyərini çıxmaq kifayətdir.

Misal

Alqoritmin reallaşdırılması

map məlumat strukturunu elan edək.

map<int, int> m;

Kompüterlərin sayını və sorğuların sayını oxuyaq.

scanf("%d %d", &n, &q);

və n + 1 nömrəli uydurma kompüterlərini başlat.

m[0] = 1;
m[n + 1] = 1;

Şəbəkədə kompüter qruplarının sayını dəyişən ilə idarə edəcəyik. Əvvəldə bütün kompüterlər işləyir, belə ki, cnt = 1.

cnt = 1;

sorğularını ardıcıl olaraq işlə.

while (q--)
{
  scanf("%d", &t);
  if (t == 1)
  {

Sorğu t = 1. nömrəli kompüter xarab olur. Əgər kompüter artıq xarabdırsa, heç bir əməliyyat lazım deyil.

    scanf("%d", &l);
    if (m[l] == 0)
    {

Müxtəlif halda, kompüterinin vəziyyətini xarab olaraq təyin edirik.

      m[l] = 1;

kompüterinin qonşularının (işləyən və ya xarab olan) vəziyyətinə əsasən, qrupların sayını yenidən hesablayırıq:

      k = m[l - 1] + m[l + 1];
      if (k == 2) cnt--;
      else if (k == 0) cnt++;
    }
  }
  else

t = 2 tipli sorğu üçün şəbəkədə cari kompüter qruplarının sayını çıxırıq.

    printf("%d\n", cnt);
}