• 寒武纪camp Day5


    补题进度:6/10

    A(状压dp)

    题意:

      有n个数字1,2,...,n,有m个限制(a,b),表示至少要有一个数字a排在数字b的前面

      你需要构造出一个含有数字1~n的序列,数字可以重复多次,要求该序列满足所有的m个限制,并且长度最短,你只需要输出最短的长度

      n<=18,m<=n(n-1)

    分析:

      首先,最多只需要2n长度就可以满足任何限制,即在前面放上1~n,在后面放上1~n,每个数最多只需要出现2次就够了,有的仅仅需要出现一次

      我们很自然的想到枚举哪些数出现一次,把出现一次的放在中间,出现两次放在两边,然后判断是否合法,判断是否合法只要中间的数形成一个拓扑序就行了

      这样复杂度是$O(2^n*n^2)$的,在多组数据的情况下有点超时

      因为n很小,我们考虑状压dp,dp[s][i]表示考虑到第i个数应该放谁,前面放的数字的集合是S情况下,目前最短的序列长度

      我们枚举第i位填上x,那么

      dp[s∪x]=dp[s]+1(x的前驱都在s中,我只需要把x放进去就行了)

      dp[s∪x]=dp[s]+2(x的某些前驱不在s中,我不仅要把x放进去,还要把一个x丢到最后面来满足其它限制)

      这样时间复杂度是$O(2^n*n)$的,可以顺利通过

    B

    solved

    C(异或性质+分段打表)

    题意:

      给定n,m,求(0 xor n)*(1 xor n)*(2 xor n)*......(m xor n)的值,对一个大质数取模

      1<=m<n<=1e9

    分析:

      有这样一个性质:$[0,2^l-1]$中所有数去和一个数x异或,得到的数仍旧是$[0,2^l-1]$中每一个数,只不过映射位置发生了变化

      于是我们可以把m转成二进制,枚举位置i作为分界点,当然m[i]=1,那么令m[i]=0,后面位都是自由元了,就可以去计算了,结果是一段数字的乘积

      那么问题是如何快速统计一段数字的乘积,数字的值可能高达1e9

      我们可以预处理1~1e9的阶乘表,然后相除就行了,但1~1e9的阶乘表很大不能全部打下,我们就分段打表,每隔2e5个打一个

    D(树形dp)

    E(二次剩余)

    待填坑

    F(计算几何+贪心)

    待填坑

    G(dfs+dp)

    待填坑

    H(贪心)

    题意:

      给出长度为n的序列,序列中每个元素是P或者V,左端是起点,右端是终点,通过一个V可以获得1个金币,通过一个P必须要支付1个金币(换句话说如果金币不够不能通过该位置)

      现在一个team若干个人共同来玩这个挑战,他们的金币是共用的,现在他们的目标是至少有一个到达终点,现在问这个team中最少需要多少人参加这个挑战

      n<=1e5

    分析:

      二分人数mid,然后判定

      容易发现所有人应该站在一个位置的,首先用现有的金币拿一个人向后试探(如果试探到了终点,那么就可行了),然后在可到达的这段区间中选一个获得金币最大的位置,让所有人都去那,不断迭代下去

      如果发现所有人始终停在一个固定的位置但不是终点,那说明当前人数是不够的

      时间复杂度O(nlogn)

      这题很容易有个错误的思路,就是拿mid-1个人去赚金币,让1个人去通关,当时Onsite的时候就是这样WA了一下午,事实上那1个人也可以帮忙赚金币的

    I(插头dp)

    待填坑

    J(后缀树)

    题意:

      给出一个长度为n的字符串,字符串是由小写字母a~l(12个字符)组成的

      现在你可以构造一个12个元素的置换把a~l分别置换掉

      你需要对于字符串的每个后缀都判断是否可以构造一个置换p,使得该后缀成为所有后缀中字典序最大的那个

      n<=1e5

    分析:

      考虑把所有后缀都丢到一个Trie中

      考虑一个后缀suf[i]要想成为最大的后缀那么要满足什么条件呢?

      那就是从root到它这个点x之间所有路径的分叉处,会产生一些限制条件,比如某个点下面三个分叉点,边上的字符分别是'a' 'd' 'f',含有点x的是'd',那么必须满足p['d']>p['a'] p['d']>p['f']

      我们去遍历一遍x到root,把所有限制拿出来,如果能拓扑排序的话那么就是ok的

      很显然我们要去用后缀树去优化建树

      这样时间复杂度是O(n^2+n*12*12)的

      注意用SAM去构后缀树的时候,我们还要求出每条边的对应字符,然后限制用状态压缩之后的二进制数表示,在后缀树上dfs统计每个后缀节点的答案就行了

  • 相关阅读:
    兼容火狐回车事件
    html的锚链接位置偏差解决
    jq记住密码
    PHP界面显示中文乱码
    ThinkPHP5.0学习1
    Fatal error: Call to undefined function pasterTempletDiy()
    dede问答模块修改
    PHP:Deprecated: Function set_magic_quotes_runtime() is deprecated 错误
    jq根据文本显示内容设置样式
    Tomcat Remote Debug操作和原理
  • 原文地址:https://www.cnblogs.com/wmrv587/p/8487219.html
Copyright © 2020-2023  润新知