Codeforces Round 569 (Div. 1)
https://codeforces.com/contest/1179
A. Valeriy and Deque
题意:一个队列,每次拿出队首和队首后面那个,把大的放回队首,小的放到队尾,多次询问,问第m次操作时拿出的是哪两个数。
模拟
显然如果队首是最大值,以后就是队列其他元素循环。所以先模拟到把最大值放到队首,以后只要看循环到哪里即可。
1 |
|
B. Tolik and His Uncle
题意:nm的网格,从左上角开始,要走遍所有格子,每格停一次,且走的向量不能重复,构造走的序列。
构造
考虑只有一行时,左右走位,1,n,2,n-1,···
同样还是左右走,不过要在两行里跳,左上到右下,走中心对称。走完两行后再向中间缩,再走两行,直到走完或者还剩一行,对这一行就向之前说的左右走位。
1 |
|
C. Serge and Dining Room
题意:排队买饭,队伍里有n个人,每人有钱数,m道菜,各有价格,每道菜只有1份,每人只买他能买到的最贵的菜。问最终剩下的菜里最贵的价格。
线段树
考虑什么时候一道菜会没人买。
只有当能买得起的人数小于比它贵的菜数,它才没人买。注意可能存在买得起的人小于比它贵的菜数,但它仍被买了,原因是有人买不起更贵的,只能买这个菜,这时更贵的那个就没人买了,就是答案。
所以就是要找最大的,买的起的人数小于比它贵的菜数的价格。
权值线段树维护区间修改,对每道菜从1到它的价格区间+1,表明它比这些价格贵,每个人从1到钱数区间-1,表明能买得起这些价格,最终要找最右的大于值0的位置。
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment