Problem statement here. I understood the solution for this.
How to compute the minimum number of rounds required? (this is not asked in that question)
# | User | Rating |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
# | User | Contrib. |
---|---|---|
1 | cry | 170 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 160 |
5 | djm03178 | 158 |
5 | -is-this-fft- | 158 |
7 | adamant | 155 |
8 | Dominater069 | 154 |
9 | awoo | 152 |
9 | luogu_official | 152 |
Problem statement here. I understood the solution for this.
How to compute the minimum number of rounds required? (this is not asked in that question)
Question. I understand how to solve this using Segment Trees.
I saw this solution by pikmike.
#include <iostream>
using namespace std;
#define f() for (i = y = 0; k = i / P, i < n; ++i)
main(){
int P = 450, n, m, x, y, i, k, a[P*P], b[P];
cin >> n >> m;
f() cin >> a[i], b[k] = 2e9;
for(;m--, cin >> x; cout << y << " ")
f() i%P || !y * b[k] >= x ? y | a[i] < x ? : (a[y = i] -= x, ++y), b[k] = max(i%P ? b[k] : 0, a[i]) : i += P - 1;
}
Can someone explain how this works?
1.
This solution uses a break
statement at the end of for(int i=0; i<n; i++)
loop (just after mask -= (1<<i)
).
How to "prove" that this break
still allows all cases to be tested?
What are some other problems that have this?
2.
What is the time complexity (closed form?)?
My take:
If $$$T(k)$$$ is the time complexity when there are $$$k$$$ zeroes in the mask
, then
(as there are (k-1) choices for j
)
Required: $$$T(n)$$$.
If that break
is removed, then
Name |
---|