csp-s模拟81
T1:
数据范围显然状压,但考试时没有想到,打了个爆搜拿了70分
记录上行点亮状态和操作状态,枚举这行的操作状态进行dp就好了
T2:
计算方案数:
考虑按val从大到小向序列中插入,那么之后的元素对当前元素就没有影响
于是答案就是\(\prod _{i=1}^n min(i,key_i + sum_{val_i})\)
其中\(sum_{val_i}\)表示在\(i\)之前的等于\(val_i\)的元素个数
构造方案:
贪心的选择,每次选择能选的点中字典序最小的,然后将所有未选的且val比它小的点的key减1
当某个点的key减为1的时候,我们选择的点还应该满足val小于等于这个点
所以可以对val排序,用线段树维护字典序最小的点
区间key值减1,当key减到1时,将该点的val插入一个multiset中表示限制
当选择该点之后再在multiset中删除该权值
T3:
随机化可过……
正解:
考虑设\(dis_{i,j,k}\)表示从i到j经过k条x边的最短路,跑个分层图就可以算出
那么问题就转化为方程:
\(min\{dis_{1,i,a}+a*x\}+min\{dis_{i,n,b}+b*x\}=min\{dis_{1,n,c}+c*x\}\)
是否有整数解
发现这三个min实际上是三个由一次函数构成的凸壳
那么我们可以维护三个凸壳(每段被哪个一次函数控制)
然后用三个凸壳的拐点划分区间,即可保证在每个区间内这三个函数都是直线的形式
那么就可以对每个区间解方程,看是否有在这个区间内的整数解即可