Прошел первый этап XV Открытого Кубка по программированию. Как решать задачи А, Е, К?
# | User | Rating |
---|---|---|
1 | tourist | 3565 |
2 | Benq | 3540 |
3 | Petr | 3519 |
4 | maroonrk | 3503 |
5 | jiangly | 3391 |
6 | ecnerwala | 3363 |
7 | Radewoosh | 3349 |
8 | scott_wu | 3313 |
9 | ainta | 3298 |
10 | boboniu | 3289 |
# | User | Contrib. |
---|---|---|
1 | 1-gon | 199 |
2 | Errichto | 196 |
3 | rng_58 | 194 |
4 | SecondThread | 186 |
4 | awoo | 186 |
6 | Um_nik | 182 |
7 | vovuh | 178 |
8 | Ashishgup | 176 |
9 | -is-this-fft- | 173 |
9 | antontrygubO_o | 173 |
Прошел первый этап XV Открытого Кубка по программированию. Как решать задачи А, Е, К?
Name |
---|
A Let's compute answer for vertex v. We can visit an associative vertex u like this:
Firstly go some steps using given edges, after that go using reversed edges.
So Dfs(vertex, isReversed) will work perfect here.
From isReversed = false we can go to isReversed = true, but not in other way.
Code
K, dynamic programming and
meet in the middledivide and conquerSorry that I am in english.
Can you explain in more details problem K?
K dp(i, j) — first i keys are assigned, and we have covered first j alphabets.
dp(i, j) = min dp(i-1, k) + cost(k+1, j)
Let's denote optK(i, j) — optimal k that gives for us minimum.
We can prove that, optK(i, j) <= optK(i, j + 1)
let's calculate recursively calc(i, l..r, optKl, optKr).
Firstly, we can calculate dp(i, mid), then recursively solve for
calc(i, l..mid, optKl, opt(i, mid)) and calc(i, mid+1..r, opt(i,mid), optKr)).
321E - Ciel and Gondolas also can be solved using this trick
Also, you can use convex hull optimization. Lets dp(i,j) — first i keys are assigned, and we have covered first j alphabets.
Code
K can be done by dp with a convex hull trick.
I would call it "divide and conquer" rather than "meet in the middle".
Indeed, thanks.