zoukankan      html  css  js  c++  java
  • 「考试」省选14

    T1
    相当于就是在问你怎么加几条重边使得边的和最小的同时让图是个欧拉回路。
    然后求个最小生成树。
    因为最小生成树上的边最小。
    考虑一个点如果度数是奇数,就需要多走一次和父亲的边。
    然后直接dfs一次求出来就行了。

    T2
    杨氏矩阵+钩子定理的裸题。
    不懂的看我上篇博客:
    https://www.cnblogs.com/Lrefrain/p/12245356.html
    然后发现这个题问的就是有多少种方案来把需要打的关全都打了。
    此处的方案不同指通关顺序不同。
    我们发现需要通关的部分两个平行四边形的并,不是杨氏矩阵的形状。
    考虑直接给扭成矩形方便计数。
    于是改变坐标,使得(A=A-B+1,C=C-D+1),这样就转过来了。
    现在是两个矩形的并
    直接用钩子定理即可。
    我们预处理阶乘,然后再预处理阶乘的前缀积即可。
    这样在查询的时候需要求逆元,复杂度是(O(qlog1e9))的。
    具体来说可以把这个矩形的并拆开来算。
    如果这个并是两个中某一个矩形,那么就可以直接算这一个矩形了。
    细节很多我懒得说。
    总之,用阶乘和阶乘的前缀积可以算,一些规律自己手玩就行了。

    T3
    正解看不懂。
    不过暴力的40分dp还是挺帅的。
    我们设:(dp[i][0/1])为第(i)轮之前的时候第(i)个硬币为正/反面时阿针(珍)得到的价格的最大值。
    那么直接dp即可。
    初始化:

    [dp[n][0]=a[n],dp[n][1]=0 ]

    转移:
    如果(i&1):

    [dp[i][0]=max(dp[i+1][0],dp[i+1][1])+a[i] ]

    [dp[i][1]=max(dp[i+1][0],dp[i+1][1]+a[i]) ]

    第一个的意思是说因为当前这个位置本来就是正面,也就是说我下一次优秀的选择肯定是不翻当前这一个,也就是说我翻了下一个,而且也可以不翻。
    第二个的意思是说当前这个位置已经被(i-1)这一次给翻了,如果下一个位置被翻了,就失去了当前这一个(a[i]),否则下一个位置如果没有被翻那么就没有失去。
    如果(!(i&1))

    [dp[i][0]=min(dp[i+1][0],dp[i+1][1]+a[i]) ]

    [dp[i][1]=min(dp[i+1][0],dp[i+1][1]) ]

    因为现在是轮到第二个人,所以要取min,方程和上面一样理解就可以了。

  • 相关阅读:
    L7-1 文本处理
    L6-14 继承多态
    L6-13 魔法方法
    L6-12 类的实例
    L6-11 综合运用
    L6-2 嵌套循环
    golang 关于引用类型
    golang close for channel
    go tip
    vscode官方文档
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12245379.html
Copyright © 2011-2022 走看看