Skip to content

Commit 3bed5cc

Browse files
committed
Dodano rozwiązanie zadania 'Rozliczenia' z XXVI OI
1 parent 4afaf63 commit 3bed5cc

File tree

1 file changed

+77
-0
lines changed
  • rozwiazania/xxvi/etap2/probne/roz

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Rozwiązanie do zadania 'Rozliczenia' z II etapu XXVI OI.
2+
// Autor rozwiązania: Paweł Putra
3+
// Złożoność czasowa: O(m * log(m))
4+
// Złożoność pamięciowa: O(m), ze stałą 1.
5+
// Punkty: 100 (upsolve)
6+
7+
struct Fenwick {
8+
int n;
9+
long long fw[1000005];
10+
11+
void add(int x, long long delta) {
12+
for (;x < n; x |= x + 1)
13+
fw[x] += delta;
14+
}
15+
16+
long long sum(int r) {
17+
long long res = 0;
18+
for (; r >= 0; r = (r & (r+1)) - 1)
19+
res += fw[r];
20+
return res;
21+
}
22+
23+
long long sum(int l, int r) {
24+
return sum(r) - sum(l-1);
25+
}
26+
} fw;
27+
28+
struct Deque {
29+
int n, first, last;
30+
Deque() {}
31+
Deque(int n) : n(n), first(0), last(0) {}
32+
void push_back(long long x) {
33+
last = (last + 1) % n;
34+
if (last == first) {
35+
// Trzeba nadpisać to co było w miejscu pierwszego.
36+
x -= fw.sum(first, first);
37+
first = (first + 1) % n;
38+
}
39+
40+
fw.add(last, x);
41+
}
42+
43+
void set(int i, int k) {
44+
i = (last - i + 1 + n) % n;
45+
fw.add(i, k);
46+
}
47+
48+
long long sum(int i) {
49+
int r = last;
50+
int l = (last - i + 1 + n) % n;
51+
if (l <= r) {
52+
return fw.sum(l, r);
53+
} else {
54+
return fw.sum(0, r) + fw.sum(l, n-1);
55+
}
56+
}
57+
};
58+
59+
Deque dq;
60+
void inicjuj(int m) {
61+
dq = Deque(m);
62+
fw.n = m;
63+
for (int i = 0; i < m; i++) fw.fw[i] = 0;
64+
}
65+
66+
void dodaj(int k) {
67+
dq.push_back(k);
68+
}
69+
70+
void koryguj(int i, int k) {
71+
dq.set(i, k);
72+
}
73+
74+
long long suma(int i) {
75+
return dq.sum(i);
76+
}
77+

0 commit comments

Comments
 (0)