A
考虑把每个abc当做一个位置,那么acb要么分别位于三个位置,要么ac在一个位置,b在一个位置,所以答案为C(n,3)+C(n,2)
B
首先能发现一个结论,一棵树最长直径=度数大于1的节点个数+2(n>1)
所以我们只需要枚举度数大于1的节点的度数,剩下就是一个插板问题
C
验题的时候有人写了维护10个变量的矩阵乘法,较为复杂
注意到p只有100,我们观察发现一旦三元组(ai,bi,ci)与之前的(aj,bj,cj)相同
那么这个序列就构成了循环
而(ai,bi,ci)只有106种,所以直接暴力即可
D
首先二分答案,那么问题变成是否有一个区间满足a的和>mid且b的和>mid
转化成前缀和变成sum1[r]−sum1[l−1]>mid,sum2[r]−sum2[l−1]>mid
考虑从左到右扫描序列,将sum1映射到树状数组的下标,sum2对应到树状数组维护的值
时间复杂度:nlog2n
这个题也可以做到一个log
强制令sum1[r]−sum1[l−1]<sum2[r]−sum2[l−1]
那么我们其实只需要找到满足这个的sum1[r]−sum1[l−1]的最大值即可
扫一遍直接维护即可
由于n只有105,两种做法都可以通过
E
观察题目保证ai互不相同
打表发现可能同时出现在S集合和T集合的只有150和294
枚举这两个数到底在S集合还是T集合,问题变成了比较经典的拆边费用流
对于流量从1∼m,每次增加1的流量跑一次spfa
F
两点距离dis(i,j)可以看成(xi,xj)到(yi,yj),(yj,yi)的哈夫曼距离取min
将坐标系旋转45度,到一个点哈夫曼距离相同的点是一个正方形
于是每一次3操作其实只需要查询两个矩形的并内的点的个数
由于这两个矩形是平行的 所以矩形的并要么是一个大矩形 要么是两个小矩形
这个可以利用树套树或者离线三维偏序维护
对于每次2操作考虑重构,等价于查询n个矩阵内有多少个点
这个可以扫描线+树状数组统计
总时间复杂度nlog2n
由于时间没有卡的很紧,赛时一些nlog3n的做法也通过了
G
首先不考虑晋升,那么每个位置上的选择可以写成y1∗x,y1∗yy−1∗x2+y1∗(yy−1)2∗x3+...
这个可以写成t∗1−kxx的形式
于是不晋升时问题就可以用一次分治NTT+求逆来解决
观察到有一次晋升其实是一个前缀多项式乘后缀多项式
把这个转化成全局多项式相乘除掉中间那一段多项式
于是我们可以考虑维护每一段长度为o的多项式的乘积
考虑从左到右扫过去,相邻两个位置相当于是除掉一个多项式,乘上一个多项式
由于多项式系数只有1,所以我们利用类似背包可以O(o)维护
总时间复杂度nlog2n+no