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

  • 相关阅读:
    java-引用数组、继承、super关键字
    java-分支重载以及构造方法
    java-面向对象之类、对象
    java-方法创建与使用
    java-数组排序之冒泡排序(经典排序)
    java-循环的应用环境以及数组的创建
    java-循环
    java-运算符与判断
    java-分支结构(四种基本分支结构的认识)
    java-运算符以及简单运用
  • 原文地址:https://www.cnblogs.com/Gkeng/p/11809809.html
Copyright © 2011-2022 走看看