Massiv - sayğac yaradırıq. Hər bir sorğu [l, r] üçün iki əməliyyat edir: cnt[l]++ və cnt[r + 1]--. Beləliklə, qismən cəmi \displaystyle\sum_{j = 1}^i cnt[j] -ci pul qutusundakı sikkələrin sayına bərabər olacaq.
Royun hərəkət etdiyi günlərin sayı 10^6-ı keçmir. Hər bir gün o, hər bir pul qutusuna ən çox bir sikkə qoyur. Bütün əməliyyatların tamamlanmasından sonra hər bir pul qutusunda ən çox 10^6 sikkə olacaq. 10^6 ölçüdə massivi yaradırıq və -yə cəmli pul qutularının sayını daxil edirik. Bunun üçün hər bir qismən cəm üçün sum = \displaystyle\sum_{j = 1}^i cnt[j] coins[sum]++ edəcəyik.
Ən azı sikkə ehtiva edən pul qutularının sayını hesablayırıq. Bunun üçün massivində qismən cəmləri sağdan sola doğru hesablayırıq (yəni sondan). Beləliklə, ən azı sikkə ehtiva edən pul qutularının sayı -a bərabər olacaq.
Nümunə
Pul qutularına sikkələrin belə paylanmasını alırıq:
cəmli pul qutularının sayı. Qismən cəmlər (sağdan sola hesablama) ən az sikkəni ehtiva edən pul qutularının sayını göstərir.
cəmli bir pul qutusu var (nömrə -ci pul qutusu), cəmli iki pul qutusu var (nömrə və -ci pul qutuları), cəmli üç pul qutusu var (nömrə və -ci pul qutuları), cəmli bir pul qutusu var (nömrə -ci pul qutusu).
Coins massivinin qismən cəmlərini hesablayaraq təsdiqləyə bilərik ki, məsələn, ən azı sikkəni ehtiva edən pul qutusu var. Və ya ən azı sikkəni ehtiva edən pul qutusu var.
Alqoritmin həyata keçirilməsi
İşçi massivləri elan edək.
#define MAX 1000010
int cnt[MAX], coins[MAX];Giriş məlumatlarını oxuyuruq. massivini qururuq.
scanf("%d %d",&n,&m);
for(i = 0; i < m; i++)
{
scanf("%d %d",&l,&r);
cnt[l]++; cnt[r+1]--;
}dəyişənində massivinin qismən cəmlərini hesablayırıq. -ci qismən cəm -ci pul qutusundakı sikkələrin sayına bərabərdir. cəmli pul qutularının sayına bərabərdir.
sum = 0;
for(i = 1; i <= n; i++)
{
sum += cnt[i];
coins[sum]++;
}massivində qismən cəmləri sağdan sola yenidən hesablayırıq.
for(i = MAX - 2; i >= 0; i--)
coins[i] += coins[i+1];Sorğuların sayını oxuyuruq. Hər bir sorğu üçün dəyərini oxuyuruq və cavabını veririk.
scanf("%d",&q);
for(i = 0; i < q; i++)
{
scanf("%d",&x);
printf("%d\n",coins[x]);
}Python ilə həyata keçirilməsi
İşçi siyahılar elan edək.
MAX = 1000010
cnt = [0] * MAX
coins = [0] * MAXGiriş məlumatlarını oxuyuruq.
n = int(input())
m = int(input())siyahısını qururuq.
for _ in range(m):
l, r = map(int, input().split())
cnt[l] += 1
cnt[r + 1] -= 1dəyişənində siyahısının qismən cəmlərini hesablayırıq. -ci qismən cəm -ci pul qutusundakı sikkələrin sayına bərabərdir. cəmli pul qutularının sayına bərabərdir.
sum = 0
for i in range(1, n + 1):
sum += cnt[i]
coins[sum] += 1massivinin qismən cəmlərini sağdan sola yenidən hesablayırıq.
for i in range(MAX - 2, -1, -1):
coins[i] += coins[i + 1]Sorğuların sayını oxuyuruq. Hər bir sorğu üçün dəyərini oxuyuruq və cavabını veririk.
q = int(input())
for _ in range(q):
x = int(input())
print(coins[x])