贪吃蛇
如果选择吃,那么实力最强的蛇的体力值将减去实力最弱的蛇的体力值,实力最弱的蛇被吃掉,退出接下来的决斗。之后开始下一轮决斗。
那么战斗其实取决于最强蛇会不会吃。
博弈论背景
有条件:
ax=an−a1
先分类讨论:
当体力最大蛇吃掉后不会被吃则能吃。
而当其它蛇不够吃ax则能吃。
以下是ax<a2的讨论
又知道其它蛇当体力小于ax时不能吃,否则当吃了ax后会被吃时不能吃,又知道只要其余有一个比它小的就不会被吃。
找到最后一个不能吃的蛇是谁,则前面的蛇分奇偶判断能不能吃。
以上。
策略总结是:
如果吃完后不是最小的则能吃。
否则就按上面的条件判断,这只会运行一次。
然后发现增量都是递减的,所以用两个双端队列维护即可。
树上的数
出题人不讲武德的是。
每次操作你需要选一条未被删去的边,此时这条边所连接的两个结点上的数字将会交换,然后这条边将被删去。
看起来是贪心,看看特殊情况:
菊花
发现我们要尽量将最小数字往最小结点跑最优。
又发现我们删n-1条边的交换可以等价于先将中心转到一条花瓣再将这个花瓣转到另一个花瓣…
所以先由数字1所在结点选再…每次都选可选的最小的即可。
链
首先将1交换过去?
不行因为可能先换别的更优。
但是可以确定交换链的优先级。
所以我们得到了这部分的算法:
从数字1到数字n逐位贪心,每次选择一个当前数字能到达的、不与之前条件冲突的、标号最小的节点,作为这个数字最终所在的节点。然后将新产生的条件加入。
具体的实现可以在每一个节点上维护一个标记值0,1,2,分别表示这个节点左右的两条边之间的优先级 没有限制、左边大于右边、右边大于左边。然后每次从当前数字所在位置向左右两边找符合条件的点,再把新条件对应的标记值更新即可。
树
对于链是一系列优先级关系。
对于树也是。
只要将链的条件扩大到所以边最大和最小即可。
用菊花的方法将一个点周围边的关系维护一下即可。
对每一个并查集建了一个虚点,如果一条边的优先级最大,那么由虚点向它连一条边,如果一条边优先级最小,则由它向虚点连一条边,这样就可以直接套菊花部分的代码了。
然后贪心过程与链类似,每次从一个点出发遍历整棵树,每走一条边就判断一下,然后再对一条路径进行修改即可。
喵了个喵
本题核心是考虑增量。
k=2n-2
可以保证任意时刻栈里元素不超过2
k=2n-1
考虑变化,我们不能直接保证栈里元素限制。
设新的数是 x。如果新的数堵住了一个栈顶那么来一个这种栈顶就 GG 了。堵住了空栈那么来一个栈底的就 GG 了。
考虑x可以怎么通过放到别的位置消除影响。
进一步考虑:
栈Px的栈顶牌同类的牌在牌堆顶至x这些牌出现的次数
奇数次:放空栈
偶数次:放栈顶