多校NOIP17
T1:
要求中位数最大,可以想到根据权值进行排序
一个重要的结论是,中位数随x的增加单调不增,
于是考虑单调指针,依次贪心判断该中位数是否可行,
选取最大即可,那么问题就转化为求一段区间前k大,
根据时间建立主席树即可
T2:
考虑首先想到的是Dijkstra等求解最短路的算法,
只需要将三角不等式变形为d[y] > d[x] << 1 | wgt[i]
然而问题在于取模比较大小,首先若只包含乘
操作可以转化为log加运算比较大小,然而并不可行,
另一种思路为高精度,可以发现本题空间无法接受
给出一种新的比较直接的思路,既然不等直接
比较大小,那么可以转化思路,如果能够保证d[x]
单调递增,那么可以直接避免比较的过程,于是考
虑转化最短路过程,根据题中最短路定义,能够想
到贪心,显然先选择0,后选择1,那么考虑Bfs,
假设队列中所有点按d单调递增排序,考虑如何保证
之后的点仍然单调,仍然为先选0后选1,然而存在
一个问题,若队列中存在d相同的点怎么办,显然
直接贪心会收到队列中位置与图连边的影响,那么
可以直接将所有d相同的点全部取出队列,全部处理
先入队0后入队1即可
T3:
考虑总方案数显然为a^n,能够想到期望的转化
问题即求每个数值被选择的概率,也就是方案数,于是
考虑钦定选择i,显然的贪心策略为从小往大选,因此
i之前的所有数一定必选,又由于所选数数总和不超过m
因此可以进行dp,设f[i][j][k]为钦定最大值为j,选了i个
小于j的数,且数字总和不超过k
也就是枚举最大值,选了多少个小于最大值的数,
以及数的总和的方案数,考虑剩余位置从大于i的数中
随便选即可
对于f的求解背包或容斥皆可,考虑容斥出i个小于
j的数,枚举有多少大于j的数,奇加偶减即可,问题转化为
sigma x = m - k * j,考虑首先钦定这t个数大于等于1,两侧
同时加t * (j - 1)保证t个数大于等于j,考虑g定义为不大于k
也就是可以插0,于是组合数同时加1插板即可
T4:
基本思路为钦定每个点的根节点判断同构方案数,
考虑首先处理树2自同构的方案数,枚举树2每个点为
根节点,问题在于处理树相同的情况,这里CQBZ巨佬
采用的树上Hash,考虑可以拓展一般的字符串哈希到
树上,哈希变量由单个字符变成了子树size,预处理
质数,字符集哈希即可。
剩余只需要对于树1进行dp每个点为根节点与树2
匹配即可,子树合并枚举该节点子树的所有匹配即可