zoukankan      html  css  js  c++  java
  • 远古杂题 2

    Base基站选址(线段树优化dp)

    首先写dp转移式,      $dp(i,j)$表示在第i位修建第j个基站。

    定义$l(i)$为能覆盖i的最靠左的基站,$r(i)$为能覆盖i的最靠右的基站,

    l和r数组均可以用二分求出,

    $dp(i,j)=min( dp(u,j-1)+cost(u,i)+c(i) )$     $(0<=u<i)$。

    $cost(u,i)$表示在u,i间不能被覆盖的村庄w值和,

    即$cost(u,i)=sum limits_{o=u}^{i} w(o)$   $l(o)>u igcap r(o)<i$

    设$weight(u)=cost(u,i)+dp(u,j-1)$,

    如果可以维护weight的最小值,那么就可以直接用线段树logn转移,

    显然$dp(u,j-1)$可以直接更新,难点是cost的更新。

    注意一个问题,d具有单调性,如果一个点不能被点l覆盖,

    那么它必然也不能被l-1覆盖,可以使用区间修改,

    对于每个村庄x,它如果不能被覆盖,需要被补偿,即$i>r(x) igcap u<l(x)$

    则可在处理完$r(x)$后对$l(x)$以前的weight值更新,使用vector记录每个点的$r(x)$值即可。

    因为建第j个的dp值只与j-1有关,可以使用滚动线段树维护。

    奇怪的道路(状压dp)

    观察数据范围,看到k非常小,可以利用这一点进行状压dp

    $dp(i,j,o)$表示目前在第i位,已经有j条边,当前从 i一直到i+k 的奇偶性的状态种数。

    枚举状态,有$dp(i,j+1,o$  $xor$  $1$  $xor$  $p)+=dp(i,j,o)$。

    由i转移到i+1位$dp(i+1,j,o)+=dp(i,j,o)$   $((i$  $and$  $1)==0)$

    最终目的$dp(n+1,m,0)$

    需要注意的是循环的顺序,这样才可以保证种数不重复。

    如果先枚举边数,一定会导致同一状态的重复。

    先枚举终点,可以保证以前枚举过的边不会再枚举到,就不会导致重复。

    概率充电器(概率 树形dp)

    每个点如果被充电,只可能有三种情况,

    自己充上电,父亲有电且自己和父亲的边联通,儿子有电且自己和儿子的边联通

    如果定义状态为充上电的概率,式子列的很麻烦,

    不妨定义$p(x)$为点x不能充上电的概率,

    $q(x)$为点x自己发电的概率,$data(x,y)$为边x,y联通的概率

    $p(x)=(1-q(x))*prod (1-data(x,i)+data(x,i)*p(i))$

    或$p(x)=(1-q(x))*prod (p(i)+(1-p(i))*(1-data(x,i)))$

    上式中i为与x相连的点

    两种计算方式是等价的,

    第一种的解释为,该点不自己发电 * 边不联通 或 边联通且联通点无电

    第二种的解释为,该点不自己发电 * 联通点无电 或 联通点有电且边不联通

    有后效性,但n的范围过大不支持高斯消元

    考虑树形dp,第一次dfs更新子树和自己对该节点的贡献

    第二次dfs更新除子树和自己以外的点对该节点的贡献

    因为只有乘的操作,更新的时候把以它为根的子树贡献除回去即可

    答案显然为$sum limits_{i=1}^{n}(1-p(i))$

    走迷宫(高斯消元 tarjan缩点)

    INF的条件为,存在一个点,起点能到达但它无法到达终点。

    定义$E(x)$为x到终点的期望长度,显然$E(t)=0$

    $E(x)=sum limits_{i=1} E(i)/out(x) +1$          i为x的出边所连点

    数据范围,如果对全图高斯消元,将TLE

    题中提示强连通分量大小不超过100

    可以在强连通分量形成的DAG图的反图上进行拓扑排序

    对于每个强连通分量进行高斯消元,强连通分量中每个点的出边已经处理好,则可以解出该强连通分量中每个点的答案

    目标即$E(s)$

    XOR和路径(期望 高斯消元)

    算法一:

    因为是位运算,加上300的数据范围,显然要按位来进行高斯消元

    给每个点开一个0域和一个1域,分别表示经过这一点且目前的xor和值为0和1的期望次数,显然该状态可以由它的每一个入边所连的点的状态转移而来。至于由0域还是1域,由边权该位为0还是1决定。

    初始在起点,所以给起点的0域期望值加一,作为初始值以解出其他期望。

    因为终点的期望经过次数必定为1

    答案即每次消元终点1域的期望值乘该位对应的值大小 之和

     

    算法二:(%yxm)

    注意到终点没有出边,这是算法一中忽略的点

    刚开始打的时候想到了可以直接对概率进行消元,但起点概率未知,于是只好打出了算法一

    同理按位高斯消元

    定义状态为该点到终点xor值为1的概率

    显然终点的概率为0

    一个点的概率可以由它的出边为1概率转移而来

    答案即每次消元起点的概率乘该位对应的值大小 之和

    卡牌游戏(dp  期望)

    可以发现一个特点,当人数固定的时候,每个人的胜率都是固定的

    于是可以以游戏进行的逆过程进行dp,即倒着dp

    当只剩下一个人的时候 显然他的胜率是1

    我们需要知道当前轮是谁在坐庄,但是如果多加一维dp,就会很臃肿,不妨让每轮坐庄的人都换到1号位

    于是可以进行dp,该状态由人数减一,这个人下一次的编号转移过来

    因为庄家始终是1,这个人下一次的编号就是这一次的编号减去卡牌上的数字,当然应该对一个数取模

    OSU(期望)

    $(n+1)^3-n^3=3n^2+3n+1$

    每一次新增一个操作,目前的期望得分应该是 前一个期望得分 加上 期望的得分增量

    期望得分增量与当前的期望连续1长度有关

    每次的长度增量必定是1,于是可以处理出当前期望的长度和长度平方的期望,注意后者不等于前者的平方

    硬币游戏

    数据范围n<=300  加上如此诡异的数据,应该是高斯消元了

    设P(i)表示完成第i个串的概率

    诡异点:引入一个P(0)表示 一个串也不能匹配上的概率

    于是P(i)可以用P(0)来表示

    在P(0)后面接m个字符,可以凑成P(i)

    但是还有已经可能凑成其它的字符串j,那么这个j一定满足j的后缀等同于字符串i的前缀,并且字符串0的后缀等同于字符串j的未匹配的前缀

    $sum limits_{j=1} sum limits_{k=1}  P(j)*1/2^{m-k}+P(i)=P(0)*1/2^m$

    k为匹配的长度

    还差最后一个方程才能解出n+1个变量,这个方程就是$sum limits_{i=1}  P(i)=1$,即所有串的概率总和是1

  • 相关阅读:
    Python笔记 —— 使用open打开和操作txt文件
    Python笔记 —— 文件路径
    Python笔记 —— 四种容器(列表,元组,字典,集合)
    C++笔记 —— 异常
    C++笔记 —— map常用方法
    C++笔记 —— 在模板类中重载操作符
    C++笔记 —— vector常用方法
    C++笔记 —— 强制类型转换
    TCP连接三次握手四次挥手
    HashMap中自定义对象key,实现hashcode与equal
  • 原文地址:https://www.cnblogs.com/skyh/p/11200933.html
Copyright © 2011-2022 走看看