A
签到题,输出"Welcome to 19th NBT Programming Contest"即可
B
考虑dp预处理出2×105内的所有答案然后O(1)查询
设:
fNBT[i]表示长度为i且含有子序列'NBT'的字符串个数
fNB[i]表示长度为i且含有子序列'NB',但不含子序列'NBT'的字符串个数
fN[i]表示长度为i且含有子序列'N',但不含子序列'NB'的字符串个数
f0[i]表示长度为i且不含子序列'N'的字符串个数
则有
fNBT[i]=fNBT[i−1]×26+fNB[i−1]×1
fNB[i]=fNB[i−1]×25+fN[i−1]×1
fN[i]=fN[i−1]×25+f0[i−1]×1
f0[i]=f0[i−1]×25
以计算fNB[i]为例,如果前i−1位已经含有子序列'NB'了,由于不能含有子序列'NBT',则第i位只能选取除'T'以外的25个字母;如果前i−1位只含有子序列'N',而不含有子序列'NB',则第i位只能是'B'
注意初始化然后递推即可
C
方法一:可以发现加法和乘法在这里的单调性是相同的,除法的单调性是相反的,乘法和除法的贡献大于加法。那么我们只需要让f为最小值,e为次小值,c和d为最大值和次大值,a和b为剩下的两个数即可。O(1)即可计算出答案
方法二:对六个数枚举全排列,对每种情况计算答案并取max即可
D
按从前往后、从后往前的顺序分别遍历n道题,遇到hard的题或者用时超过五小时就结束
两种情况得到的结果取max即为答案
E
对于平均数,只需要维护当前所有数的和,除以当前的个数即是平均值
对于众数,只需要维护每个数当前出现的次数,如果当前输入的数的出现次数大于上一轮的众数,则更新众数,出现次数相同则取较大值作为众数。
对于方差,考虑其分子部分:
i=1∑n(ai−aˉ)2=i=1∑n(ai2−2aiaˉ+aˉ2)=i=1∑nai2−2aˉi=1∑nai+i=1∑naˉ2=i=1∑nai2−2aˉi=1∑nai+naˉ2
因此分别维护ai的和,ai2的和,以及ai的平均数即可
对于中位数,可以采用对顶堆,即一个大顶堆和小顶堆
让大顶堆只存放小于等于中位数的值,小顶堆只存放大于中位数的值,则大顶堆的top永远都是中位数的值
因此可知大顶堆的size总是等于小顶堆的size或比小顶堆的size大1,对于输入进来的数判断放到哪个堆里即可
F
由于求本质不同的固定后缀的子串,容易想到后缀自动机,先用s串构建自动机。对于一个节点,该节点所能表示的字符串的数量为len[i]−len[link[i]],用输入串t去匹配,如果串t匹配失败,说明没有以t结尾的子串,答案为0;假设匹配结束后last停留在节点i,那么以i为根在后缀链接树上的子树之和减去节点i所不能表示的子串数量即为答案。
G
记录当前时间为t,对于要走的路口,t%(r+g)表示在一个红绿灯周期内所处的时刻
如果t%(r+g)+l≤g则可以在绿灯结束前直接通过
否则必须等到下一次绿灯
H
当(x1,y1)=(x2,y2)时,显然答案为0
当小汤圆和家的直线距离为整数时,只需要朝着家的方向跳一次就可以到家
当直线距离不是整数时,可以通过曼哈顿距离跳两次回家
I
设f[i]表示从当前有i个灯泡亮起,到所有灯泡都亮起的期望次数,则有:
f[i]=⎩⎨⎧0nif[i−1]+nn−if[i+1]+1f[1]+1,,,i=n1≤i≤n−1i=0
ni表示熄灭一个灯泡的概率,nn−i表示点亮一个灯泡的概率
将f[n]=0代入f[n−1]的转移方程中,得到f[n−1]=nn−1f[n−2]+1
再将f[n−1]代入f[n−2]的转移方程中,可以得到f[n−2]只关于f[n−3]的方程
所以对于1≤i≤n−1,都有f[i]=k[i]f[i−1]+b[i],其中k[i],b[i]都是常数
因此可以从后往前维护k[i],b[i],再把f[1]=k[1]f[0]+b[1]代入f[0]=f[1]+1解出f[0]的值,最后从f[0]递推出f[1] f[n−1]的值即可
J
因为输入的数组是一个排列,所以一段区间的MEX等于此区间外数字的最小值
交换位置可以看成是单点修改两个位置上的值
用线段树维护区间和、区间最小值即可
注意特判区间大小为n的情况