• 2016 Multi-University Training Contest 5 solutions BY ZSTU


    ATM Mechine

    E(i,j):存款的范围是[0,i],还可以被警告j次的期望值。

    E(i,j) = (max_{k=1}^{i}{frac{i-k+1}{i+1} * E(i-k,j)+frac{k}{i+1}*E(k-1,j-1)+1})
    这样时间复杂度是(O(K^2W))的。
    假如Alice使用的是二分策略,那么在最坏情况下至多被警告(left lceil log_{2}{K} ight ceil) 次。
    于是W:=min(W,15)就可以了。

    然后clar有人问y是不是要整数。由于存款是整数,你取小数的钱没有任何意义啊。

    Cycle:

    首先A、B两个串循环相同的话,那么A串可以拆成一个前缀和一个后缀,交换下位置就得到了B串。设bs[i]表示所有的k满足子串B[k...k+i]和子串A[0...i]相同,用bitset来存,然后再枚举下后缀的起始位置,利用bitset的位操作可解。复杂度(O(n^2/64))

    Divide the Sequence

    把长度为n的序列分成尽量多的连续段,使得每一段的每个前缀和都不小于0。保证有解。
    从后往前贪心分段即可。

    How Many Triangles

    数一数锐角的数量A和直角+钝角的数量B,那么答案就是(A-2B)/3。
    暴力算的话是(O(n^3))的。使用极角排序+two pointers就可以做到(O(n^2log n))

    这边钝角指代范围在90度到180度之间的角(不包括90和180)。

    Interesting:

    用manacher算法O(n)求出所有的回文半径。有了回文半径后,就可以求出cntL[i]表示以i结尾的回文串的起始位置的和cntR[i]表示以i起始的回文串的结尾位置的和,然后就可以求出答案了,这里要注意奇偶长度回文串的不同处理。复杂度O(n)

    Interval:

    首先考虑区间覆盖几个(大于1个)序列的,设ans[i]表示区间gcd为i的倍数的区间数,那么除了两端的序列,中间的所有序列的gcd都为i的倍数,于是搞出每个序列的gcd和所有的前缀gcd和后缀gcd,对于ans[i]就可以利用所有的前缀gcd和后缀gcd和完整序列gcd来求,需要好好处理细节。复杂度为O(n*(最大因子个数))。
    然后考虑区间在一个序列中的,由于对于每个位置结尾的不同gcd数最多是log个,所以(O(n log n log n))可以解决。

    K-wolf Number

    数位dp,状态里一下前K-1个数位上的数字即可。标程是std::map<std::vector,long long>这样记的状态。

    Level Up

    当第i个人的能力值从A_i变成100000时,会导致他在树上的祖先中原本中位数不小于A_i的部分发生变化,从(left lceil frac{t}{2} ight ceil th) 变成((left lceil frac{t}{2} ight ceil + 1) th)。所以如果知道每个节点的这两个值,就可以dfs一遍用树状数组求出答案了。
    考虑如何求(left lceil frac{t}{2} ight ceil th)((left lceil frac{t}{2} ight ceil + 1) th)
    一种做法是使用CCPC-WFinal 1008的线段树方法,为每个节点维护一棵权值线段树,然后合并两棵线段树时,如果一棵是空的,就返回另一棵,否则递归合并。然后就是求线段树第K大这样的经典问题了。这个做法时间复杂度O(nlogn),空间复杂度O(nlogn)。
    另一个做法是每个节点维护两个堆,第一个堆放前一半元素,其他放在第二堆里。然后合并堆时使用启发式合并的策略即可。这样时间(O(nlog n^2)),空间O(n)。
    然而实测第二个做法跑得比第一个快。

    Permutation:

    首先求出dp[i][j][k]表示i子树中j在第k个位置的合法排列情况数,然后对于某一个u子树,枚举下u子树下的两个不同子树的v1,p1,v2,p2,表示v1结点在第一个排列第p1个位置,v2结点在第p2位置,再枚举下v1结点插入到v2排列的第k个位置,这样子的复杂度是(O(n^5))。由于v1和v2有大小关系,可以处理出前缀和的东西来优化下,可以达到(O(n^4))的复杂度。实际上努力下好像也可以达到(O(n^3))的复杂度,但这题只要求(O(n^4))

    Prefix:

    将字符串一个个的插入字典序,在字典序中维护好有该前缀串的最大编号字符串,用一个线段树维护好,每个字符串控制了多少个前缀串,由于询问是在线的,所以用主席树来维护。于是对一个询问(l,r),在第r个线段树求一下区间(l,r)的和即为答案。复杂度(O(n log n))

    Two:

    水题。dp[i][j]表示A序列前i个数和B序列前j个数的相同子序列对有多少个。复杂度(O(n^2))

    World is Exploding

    给一个长度n的序列A,问有多少四元组(a,b,c,d)满足:4个数两两不同,1 <= a < b <= n,1 <= c < d <= n,A_a < A_b,A_c > A_d。
    定义:
    (rg(x) = left | { y | x < y <= n, A_x < A_y } ight |)
    (lg(x) = left | { y | 1 <= y < x, A_x < A_y } ight |)
    (rs(x) = left | { y | x < y <= n, A_x > A_y } ight |)
    (ls(x) = left | { y | 1 <= y < x, A_x > A_y } ight |)
    (allg = sum_{i=1}^{n}{rs(i)})
    以上都可以通过树状数组在(O(n log n))的时间内求出(需要先对A序列进行离散化处理)。
    然后,
    (answer = sum_{a=1}^{n}{rg(a) * (allg - lg(a) - rs(a))} - sum_{b=1}^{n}{ls(b) * (lg(b) + rs(b)})

  • 相关阅读:
    阅读笔记
    学习小记
    networkx学习笔记
    ORM查询简化
    redis等缓存
    redis相关缓存知识
    Centos7网络配置
    redis安装详细
    redis安装详细
    mobaxterm使用手册
  • 原文地址:https://www.cnblogs.com/duoxiao/p/5777661.html
Copyright © 2020-2023  润新知