zoukankan      html  css  js  c++  java
  • 省选模拟42

    A. coin

      首先可以猜出来每种钞票的贡献是独立的,所以只要对于每种钞票算出来贡献最后合并就行了。

      直接做复杂度会死掉。

      考虑对于每种钞票,张数随贡献的差分数组显然是单调的,所以可以用堆动态维护当前的最优解。

      发现最多只会用到$n$种状态,所以动态的计算这些状态,而不必全部预处理出来。

    B. B

      我的做法是,求出来至少有k条边与原来的树相同的方案数,容斥就可以得到恰好的方案数。

      方案数可以通过树形dp来求,设$f[i][j][k]$表示$i$的子树中选了$j$条边,$i$所在的连通块大小为$k$的方案数。

      然后用数树中的那个式子就可以求出来方案数。

      然后这个东西可以继续优化。考虑那个式子的实际含义,实际上就是在每个联通块内选出一个点的方案数。那么继续优化可以将第三维变成$0/1$,表示当前联通块是否已经选了。

      这样的复杂度是$O(n^2)$的。

      然后题解的做法是个套路,就是变元矩阵树+高斯消元,代入若干值直接搞即可。之前做过很多遍了。

    C. battery

      可以发现对于每个点的限制形如对若干点的同时不选的限制,似乎不可做,然而可以发现,假如在同一方向上同时出现两种炮台可以经过这个点,那么这两个炮台一定撞了。

      所以经过一个点的炮台最多两个,并且来自不同方向,否则无解,那么就变成了限制两个不能同时不选的东西。

      于是就是简单的2-sat模型,直接套就行了。

  • 相关阅读:
    文件上传和多线程通信
    黏包
    socket通信
    osi七层协议
    面向对象的反射和双下方法
    类的成员和异常处理
    python面向对象类的约束和设计的统一化规范
    单继承和多继承
    对象
    Python-----带参数的装饰器以及补充
  • 原文地址:https://www.cnblogs.com/hzoi-cbx/p/12458927.html
Copyright © 2011-2022 走看看