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实际上是三个由一次函数构成的凸壳
  那么我们可以维护三个凸壳(每段被哪个一次函数控制)
  然后用三个凸壳的拐点划分区间,即可保证在每个区间内这三个函数都是直线的形式
  那么就可以对每个区间解方程,看是否有在这个区间内的整数解即可

posted @ 2019-11-07 08:15  G_keng  阅读(119)  评论(0编辑  收藏  举报