Statistika sevənlər üçün#4421

Statistika sevənlər üçün (Həll təhlili)

Tutaq ki, massivində tramvaylarla daşınan insanların sayı haqqında statistik məlumatlar var. Daşınan insanlar sayına görə hər üçün həmin dəyərin göründüyü indekslərin vektorunu saxlayırıq. Başqa sözlə, map təsvirində , il ərzində dəqiq olaraq insan daşınan şəhərlərin nömrələrini saxlayır.

Sorğu (l, r, x) formasında aşağıdakı kimi işə salınır:

Misal

Birinci misal üçün strukturunun necə görünəcəyinə baxaq.

Məsələn, (1, 5, 314) sorğusunu yaymaq üçün aşağıdakı addımları edin:

Alqoritmin realizə olunması

İstifadə olunan məlumat strukturlarını yaradaq:

vector<int> v;
map<int, vector<int>> p;

Giriş məlumatları oxuyuruq.

cin >> n;
v.resize(n + 1);
for (i = 1; i <= n; i++)
{
  cin >> v[i];

nömrəli şəhərdə insan daşınıb. Şəhərlər -dən başlayaraq nömrələnir.

  p[v[i]].push_back(i);
}

Sorğu sayını oxuyuruq.

cin >> q;

Cavabı sətirində yaradacağıq.

result = "";

Ardıcıllıqla sorğularını (l, r, x) emal edirik.

for (i = 0; i < q; i++)
{
  cin >> l >> r >> x;

Əgər heç bir şəhərdə qədər sərnişin daşınmayıbsa, cavaba '' yazırıq.

  if (p.find(x) == p.end())
  {
    result += '0';
    continue;
  }

massivində -dən -ə qədər olan ən az bir rəqəmin olub-olmadığını müəyyən etməliyik. daxilində -dən kiçik olmayan ilk tapılanı axtarırıq.

  vector<int>::iterator it = lower_bound(p[x].begin(), p[x].end(), l);

Əgər belə bir rəqəm mövcuddursa və -dən böyük deyilsə, cavaba '' yazırıq.

  if (it != p[x].end() && *it <= r)
    result += '1';
  else
    result += '0';
}

Cavabı çap edirik.

cout << result << endl;