Link

A

只有三种情况,讨论即可

B

一个小贪心

1
2
3
4
sort (A + 1, A + 5 + 1);
for (int i = 1; i <= 5; ++i) ans1 += A[i];
for (int i = 1; i < 5; ++i) ans2 += A[i];
cout << min (ans1 / 2, ans2) << endl;

C

随便数点

D

n105n \le 10^5时,可以枚举做了QQ张试卷,剩下的题按时间从小到大做

nn更大时,直观的想法是猜答案关于QQ单峰。但实际上函数会有一部分是平的(斜率为00),无法三分

于是考虑和mm相关的做法:暴力做法在枚举做完QQ张试卷后,剩下的题按顺序做到第PP。考虑枚举这个PP,在枚举出PP后,合法的QQ是一段区间[Ql,Qr][Q_l, Q_r],并且答案在[Ql,Qr][Q_l, Q_r]上单调(可以感性理解)

因此只需要对于每个PP,计算Ql,QrQ_l, Q_r处的答案即可

E

nn奇偶分情况讨论,O(1)O(1)直接计算答案

F

先把原题的aia_i都除10,最后再乘回来

若不允许超速,那么每个点会有一个速度上限limilim_i。它们之间相互限制,即limi=min{ai,limi1+1,limi+1+1}lim_i = \min \{a_i,lim_{i - 1} + 1, lim_{i + 1}+ 1\}。然而限制关系不会互相影响(即不会从左边限制到右边,再又限制回左边),所以可以从前后分别扫一次更新limlim

允许超速的话,相当于把某个aia_i设成\infty. 显然只有limi=ailim_i = a_iii才可能超速

对于每个关键点暴力重新算一遍limlimO(n2)O(n^2)的,注意到算当前关键点的答案时,上一个关键点之前和下一个关键点之后的limlim是不会变的,所以每次只需要处理到前后第一个关键点位置即可,均摊复杂度O(n)O(n)

G

[后缀自动机] [字符串]

SAM,每个节点存在原串中最前的位置。查询时暴力匹配,用c\ge c的边更新答案

H

[拓扑排序] [博弈]

sol from xcy

设二元组(x,y)(x,y)表示当前要进行操作的人持有xx, 不进行操作的人持有yy. 则必胜点为(x,0) (x[1,n1])(x,0)\ (x\in[1,n-1]). (x,y)(x,y)可转移到(y,(x+y) mod n),(y,xy mod n)(y,(x+y)\ mod\ n),(y,xy\ mod\ n).

如果是DAG, 可以直接确定每个点为必胜点还是必败点. 但会有环.

如果不考虑环边, 一个点为必胜点, 则加上环边它仍为必胜点, 因为走到那个点的人会往必胜的那条边走. 而如果为必败点, 走到那个点的人不希望自己输, 于是会走到环上, 而无论环长为奇数还是偶数, 都可以无限地走下去, 故为平局.

因为有环所以才存在平局,否则每个点的状态都是确定的!

故可以从(x,0)(x,0)开始反推. 如果当前点为必败点, 则连向它的点为必胜点. 如果当前点为必胜点, 则先不管连向它的点. 等到有两个必胜点同时被一个点连向时, 该点就是必败点(除(x,0)(x, 0)外每个点出度都为22). 最后没有被扩展到的点一定为平局.

注意环上的必败点不能被扩展到, 只要在环上连向的点是必胜点, 另一条边连向的也是必胜点, 它就可以被确定为必败点. 而平局点也不一定在环上, 因为可能出现一个点连向环上的平局点的情况, 此时该点也是平局点.