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):
Əgər kompüterin sağında və solunda xarab kompüterlər varsa, o zaman qrupların sayı azalır. Bu, əvvəllər yalnız bir cihazdan ibarət bir qrup olan kompüterinin xarab olması ilə bağlıdır.
Əgər kompüterin sağında və solunda işləyən kompüterlər varsa, qrupların sayı artacaq.
Bütün digər hallarda qrupların sayı dəyişməz qalır.
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:
Əgər hər iki qonşu kompüteri xarabdırlarsa, -ə azalır;
Əgər hər iki qonşu kompüteri işləyirlərsə, -ə artır;
k = m[l - 1] + m[l + 1];
if (k == 2) cnt--;
else if (k == 0) cnt++;
}
}
elset = 2 tipli sorğu üçün şəbəkədə cari kompüter qruplarının sayını çıxırıq.
printf("%d\n", cnt);
}