To solve this problem, you must only do the process described in statement.
for i = 1 .. s.size() if (s[i] = '1') ans += a; else ...
In this problem, according to the small limits, we can brute all permutations and choose the best answer of all. The easeast way to do this — use standart C++ function next_permutation, or simply write 5 for. For each permutation we can simulate the process, which was described in a statement, or notice that first with second student, and second with the third will communicate one time, and third with fourth student, and fourth with fifth — will communicate two times. Another pairs of students will never communicate to each other during they stay in queue.
This problem can be solved by dinamic programming.
Dp[n][is] — number of ways with length equals to n in k-tree, where if is = 1 — there is exists edge with length at least d, is = 0 — lengths of all edges less then d.
Dp = 1.
Transition — iterate all edges which can be first on the way in k-tree, then problem transform to the same, but with less length of the way (because subtree of vertex son is the k-tree).
Dp[n] = Dp[n-1] + ... + Dp[n-min(d-1,n)]
Dp[n] = Dp[n-1] + ... + Dp[n-min(d-1,n)] + (Dp[n-d] + Dp[n-d]) + ... + (Dp[n-min(n,k)] + Dp[n-min(n,k)])
See solution for more details.
Notice that this solution can be easy midify to O(N) complexity, only precalc partial sums. But it is not neccesary to solve this problem in such way.
We will search n by binary search. Such function is monotone, because the amount of numbers with exactly k 1-bits on a segment n + 2 ... 2·(n + 1) more or equal than amount of such numbers on segment n + 1 ... 2·n. Last statement is correct, because of n + 1 and 2·(n + 1) have equals number of 1-bits.
To find the amount of numbers on segment L...R, which have exactly k 1-bits, it is sufficient to can calculate this number for segment 1...L, then the answer will be F(1...R) - F(1..L - 1).
Let's understand how we can calculate F(1...X). Iterate number of bit will be the first(from biggest to smallest) which is different in X and numbers, which amount we want to calculate. Let the first difference will be in i-th bit(it's possible, if in X this bit equals to 1, because we consider all numbers do not exceed X). Then other smallest bits we can choose in any way, but only amount of 1-bits must equals to k. We can do this in C i k - cnt ways, where cnt — the number of 1-bits in X, bigger then i, and C n k — binomailany factor. Finally, you should not forget about X (if it, of course, has k one bits).
long long F( X ) Ans = 0 , cnt = 0; for i = Max_Bit...0 if (bit(X,i) == 1) Ans += C[i][K - cnt] , cnt ++; if (Bit_Counts(X) == K) Ans ++; return Ans;
Асимптотика: O(log 2(Ans))
First of all let's understand the statement.
We have n tubes. At the beginning of each of them there are a few amount of mercury is poured. We want be able to perform two types of queries:
- Make the amount of mercury in p- th tube equals to x.
- Given the number v — the amount of water that must be optimally pour these tubes. What does it mean optimally? That mean we pour water in some of the tubes in the way, when maximum volume of liquid for all tubes, where we poured water, will be as small, as possible.
Well, actually now turn to the solution.
Use binary search to find an answer, in particular, will sort out the amount of mercury in a tubes(let it equals to d), such that in the tubes with smaller volume of the liquid can be poured all v liters of water and the maximum liquid level does not exceed d. Let the number of tubes, with the amount of mercury less than d is equal t.
Now the problem is reduced to learning how to count the total amount of water that we can to pour into each of t least tubes, such that the level of the liquid in each of them is equal d.
Let a[i] — the total amount of mercury in the tubes which exactly have i liters mercury and b[i] — number of tubes which the volume of mercury is equal i. Then t = b + ... + b[d - 1] and v 1 = t * d - (a + a + ... + a[d - 1]) — the total maximum amount of the water which can be poured. If v 1 < v, then obviously this space is not enough for pour all the water, otherwise quite enough and so the answer will be no more than d.
When we found the smallest d, we can say that the answer is equal d — ( v 1 — v) / t.
To quickly find for a + a + ... + a[d - 1] and b + ... + b[d - 1], and perform queries of the first type, you can use the Fenwick tree.
Асимптотика: O(qlog 2(n))