前言:这次不太好,rank6,挂了108.5分,不挂就随便rank1了
T1
直接状压,设\(f[S][i][j][0/1]\)表示当前选的集合为S,最后两个分别为i,j的方案数和最优解,然后直接跑
有亿点细节
1:要开long long,方案数可能很大(造一个完全图)
2,要从合法的状态转移
3,特判只有一个点的数据
T2
一道计算几何题
首先是要快速求出一个点是否在凸多边形内,考虑选定一条边,设两个端点为x,y,要求的点为z
然后求向量\(xz\)和\(yz\)的叉积,然后判断和上一条边的结果的乘积是否为正数,如果为负数就说明不在多边形内
如果都为正就在
设\(w[i][j][k]\)表示以i,j,k为顶点的三角形的权值,如果有毒药权值就是0,否则是这个三角形的面积
然后考虑固定一个点i为顶点,设\(f[i][j]\)表示i一定选,j最后选的构成的最大的面积,每一次枚举一个i到j之间的k,把\(f[i][k]+w[i][k][j]\)转移
注意,上面的判断是否有毒药在多边形内是不包含边界的,如果要合并两个多边形要看有没有毒药在相交的边界上
T3
感觉这题很新,没怎么见过
首先,这是非公平组合游戏,就不能套用SG函数这类东西
然后,一个棋子相对于其他的棋子是独立的,不会造成任何干扰,这就启发我们对每个点单独考虑
设\(f[i]\)表示i的颜色的主人为先手,A能比B多走几步,如果为正就说明A能赢
我们反着考虑,建出反图跑拓扑排序,然后考虑转移
如果为白色,\(f[i]=max(0,max(f[j])+1)\),就是能多走一步,对0取max因为可以不走这个点
如果为黑色,\(f[i]=min(0,min(f[j])-1)\),这个也显然,对0取min同样因为可以不走这个点
然后我们就可以dp了,一个点选的贡献就是f,不选就没贡献,最后判断和是否为正数,如果为0或负数A就会输,f可以直接叠加因为棋子独立
T4
赛时因为一个神必问题爆成60,原因是爆char了
求一个串包含哪些串较难,但求一个串被哪些串包含更容易些,就从后往前考虑
先从后往前把每个串拼接在一起,中间隔一些不同的字符,不能是小写字母(这里可能很多个,小心爆char,最好直接开int)
然后求出整个串的sa和rk(后缀数组)
一个性质:有三个串x,y,z,x和y的相同的前缀更长,那么sa中x和y一定更近(假如在同一侧)
那么就直接遍历拼接后的串,对于一个原来的串,直接二分有哪些后缀包含这个串,这个可以根据上面的性质算,用hash进行辅助
求出来后,我们直接在线段树上查,线段树就是存储每一个排名的串的权值,如果没有遍历到就为0,否则就为以那个后缀所在的串为结尾的满足条件的最大权值,查出来后更新当前串的,然后遍历当前串,在线段树上对每个串内的后缀对应的排名更新,然后对每个串为结尾的答案取max输出即可