• Review 2020.11.14


    Date range: 2020.10.30 - 2020.11.14

    长度为 n 的序列,每次可以选择一个区间把其中的每个数 -1,或者选择一个位置 pos 和一个值 x,把第 pos 个位置减去 x,需要保持所有数非负。求操作直到所有数变成 0 的最小代价。

    分治贪心,递归求解即可。


    有根树,每条边有 w,c,设数的权值为所有叶子结点到根结点路径上的 w 的和的总和,每次可以选择一条边,将 w 变为 w/2 下取整,花费 c 的代价,花费代价。代价只有两种。求花费一定代价能做到的最小权值。

    首先预处理每条边的次数,维护两个优先队列,每次暴力贪心行动(需要讨论一下几种情况比较选择)。


    动态维护一个技能集合:普通技能和超级技能,所有技能会按照一个排列被执行,如果技能 i 被执行时它的前一个技能是普通技能,那么会产生 w(i) 的贡献,如果是超级技能则会产生 2w(i) 的贡献。支持添加删除技能,每次操作后求技能集合的最大贡献。

    考虑维护三个集合,normal,high,low。normal 表示普通技能集合,high 表示所有技能中贡献较高的技能集合,low 为 high 的补集。任意时刻,我们控制 high 的大小为当前超级技能的总个数(因为有超级技能个技能可以被翻倍),那么 sum(*)+sum(high) 基本上就是答案,但是需要做一点点修正。如果我们希望所有的超级技能都翻倍,那么这时一定有一个超级技能是无法被翻倍的,显然此时我们一定会选择最小的那一个放弃翻倍。但只要我们希望翻倍的技能中有一个不是超级技能,那么这些技能一起被翻倍就是可以被满足的。于是我们只需要减去 high 中的最小值,再加上 normal 中的最大值即可。


    给定一个长度为 2n 的序列,你需要把它分成两个长度都是 n 的子序列,两部分分别以降序和升序排序,定义一种方案的权值为 sum abs(xi-yi),求所有方案的权值的和。

    将绝对值视为差的形式,那么无论如何划分,权值都是较大的 n 个数的和减去较小的 n 个数的和。


    有 n 对线段,初态下每对的第一条都是 ([l1,r1]),第二条都是 ([l2,r2]),定义总交集长度为每条线段的长度之和,可以花费代价 1 来延长一条线段,往左或往右延伸 1 个单位,求使得总交集长度达到 (k le 10^9) 的最小代价。

    对于线段 [l1,r1], [l2,r2][min(l1,l2), max(r1,r2)] 为这个线段对的边界线段,若两个线段的并集等于边界线段,那么我们称这两个线段是连续的。考虑一个线段对和他的边界线段之间的关系,显然线段对的实际产固定和他的边界线段的长度之间存在一个差值,如果相交则这个差值为正,如果相离则这个差值为负。将一个线段对通过最小步数的操作,使得它的并集等于他的边界线段,这个过程称为填满一个线段。我们暴力枚举要填满 i 个线段对,然后修正一下再去操作其它的线段对。


    给定一个 n×m 的网格,每个格子有一个颜色,问有多少个同色的菱形。

    类似“最大正方形”的暴力 dp。


    给定一棵树,树上每个结点刚开始有一个人,现在每个人需要走到一个不同于原来的结点,并且必须保证每个结点上有且仅有一个人,在树上走一条边的代价为 (1),求最小代价。

    我们总是从叶子结点开始处理,每次将一个(人未被换过的)叶子结点上的人和他的父亲换,然后删除这个叶子。最后可能会剩下一个点,那么随便和他的一个孩子换即可。


    给定一个长度为奇数 n 的环形序列,进行若干次操作,每次选择 i 将 a(i) 替换为 a(i-1)+a(i+1),并且删除 a(i-1),a(i+1),最后剩下一个数。求最后剩下的数的最大值。

    找规律发现,产生贡献的数中只有两个数是相邻的,其它数之间一定恰好隔一个数,因此枚举这个中心即可。


    给定两个 0-1 串 S,T,每次可以选择 S 的一个子序列,将其循环移位一格,最少操作多少能将 S 变为 T。

    先删去已经相同的部分,对于剩下的,在一次操作中显然会交替选择那些 1->0 和 0->1 的位置,需要的最小次数就是一个区间内 1->0 和 0->1 的位置的数目差的绝对值的最大值。


    考虑 ([0,n+1]) 之间的所有整点,你要从 0 走到 n+1,每秒钟可以从 x 走到 x+1 或者不动,每个位置有一个高度 h(i),每个时刻有一个高度 p(t),且 p(t) 在 0,1,2,...,k-1,k,k-1,...,1,0,如果 h(i)+p(t)>l 则失败,问是否能走到 n+1。

    在每个安全点我们可以无限等待,因此我们只需要考虑用安全点分出的每一段即可。考虑走到位置 i 并且当前的浪高为 tide,如果 dep(i)+tide>l 那么显然我们需要等待 dep(i)+tide-l 时间让浪潮接着下降,于是令 tide=tide-delta。本质上这一段非安全点都必须要在一个浪潮来回的过程中被处理完。


    设 f(x) 表示 x 的各个数位的和,求最小的非负整数 x 满足 f(x)+f(x+1)+...+f(x+k)=n,(n le 150, k le 9)

    取值连续且不会很多,猜想有 a99..99bc 这样的数满足条件。


    给定一个序列,可以进行若干次操作,每次将一个数调到开头或者调到最后,求将序列排序的最小次数,保证序列中的数字互不相同。

    不动的数构成 LCS。


    给定一个长度为 n 的序列 ai 和一个长度为 (m le n) 的严格上升序列 b(i),要求将 a(i) 划分为 m 段,第 i 段的最小值恰好为 b(i),求划分的方案数。

    考虑求出 ai 序列的后缀最小值 fi,那么对于任意位置,如果要让它作为第 j 段的首元素,必须要满足 fi=bj,因为 bj 是后面这些数中最小的数,并且 bj 必须要在后面这些数中至少出现一次。


    给定两个长度为 n 的数组 a,b,每次操作可以选择一个 k,交换 a 中长度为 k 的前缀和长度为 k 的后缀,问是否能通过若干次操作使得 a,b 完全相同。

    充要条件是对称位置无序对构成的集合相等。


    给定 n 个点的无向图和一个整数 k<=n,要求解决下面问题中的任意一个:求一个大小恰好为 (k+1)/2 的独立集;求一个大小不超过 k 的环。

    先考虑 k=n 的情况,此时如果原图是一棵树,我们直接二分图染色即可,否则我们可以直接找到一个环。考虑原问题,只要找到一个结点数量为 (k) 的连通子图即可。


    给定两个数组 a,b,长度分别为 n,m,a 是 1..n 的全排列,b 是 1..n 的 m 排列,b 是目标序列,我们需要通过以下的操作来构造一个答案序列使其等于 b,每次操作选择一个 t,将 a(t-1) 或者 a(t+1) 插入答案序列末尾,并且将 a(t) 删除,求有多少种不同的构造方案。

    考虑对于出现在 b 中的每一个 a(i),我们必然要删除 a(i-1) 和 a(i+1) 中的至少一个,设 f(a(i)) 表示 a(i) 在 b 中的出现位置,如果 a(i-1) 存在,并且 f(a(i-1))<=f(a(i)),则称这个 a(i-1) 对于 a(i) 来说是合法的(说白了就是它出现在之前)。对于一个 a(i),如果 a(i-1),a(i+1) 都合法,那么我们可以删除任意一个,方案数×2;如果二者恰好有一个合法,那么我们把它删除即可;如果二者都不合法,那么无解。


    给定一个 n×m 的矩阵,从 (1,1) 走到 (n,m),每次只能从权值为 x 的位置走到权值为 x+1 的位置,初态下可以对若干格子进行操作,每次使得一个格子的权值减小 1,求至少要操作多少次才能使得存在合法的路径。

    如果路径上第一个点的权值确定,那么整条路就的权值也就确定了,暴力枚举第一个点的高度后,dp 即可。


    每次选取一个字典序最小的三元组 (a,b,c) 满足 abc=0,将 a,b,c 依次添加到序列 S 末尾,求序列的第 n 项。

    将序列三项为一组,显然是有规律的,a,b,c 每四个按照 1,2,3,4;1,3,4,2;1,4,2,3 来排列(段也是如此),递归分治或者直接推公式。


    给定一个字符串 S 和一个字符串 T,每次操作可以从 S 的开头删去一个字符,把它加到一个初始为空的串 A 的开头或结尾,不必删完。求有多少种不同的方法使得 T 是 A 的前缀。

    即要求 A 的前 T 个字符是 A,考虑 dp,设 (f[i][j]) 表示用 S 的前 j-i+1 个字符构造出 (t[i..j]) 的方案数,简单区间 dp 了。


    给定 n×m 棋盘,每个格子有一个颜色和方向,如果一个机器人此时在某个格子中,那么下一时刻他会移动到这个格子的方向所指向的相邻的格子中。若干个机器人在棋盘上无限走下去,请找出一种放置机器人的方案,需要使得任意时刻不会有两个机器人同时出现在同一个格子中,在最大化机器人总数的前提下,最大化初态下位于黑色格子上的机器人总数。

    我们会对每个连通分量分别考虑,这个连通分量一定包含一个环以及若干个内向链,我们可以用并查集暴力找环,然后统计一下这个连通块内距离环上一个特定的点的距离为奇数/偶数的所有点中有多少个点是黑色/白色的,然后讨论一下。这样处理有一点麻烦,考虑到在足够长的时间之后,所有的机器人一定都会走到环上去看,因此我们只需要给出一个足够大的 M,求出 M 时间后,每个初态位置可以到达的位置,这些位置的并集就是答案。因此考虑倍增,令 (f[i][j]) 表示点 i 走了 (2^j) 步的答案,常规处理即可。


    给定一个长度为 n 的序列 a,每次可以选择 3 个不相同的下标 i,j,k,计算 (a[i] oplus a[j] oplus a[k]),赋值给 (a[i],a[j],a[k]),问是否能通过不超过 n 次操作,使得所有数都相同,构造方案。

    观察与构造,对于奇数长的情况,经历如下过程 (a,b,c,d,e -> x,x,x,d,e -> x,x,y,y,y -> y,y,y,y,y),对于偶数长度的情况,前面先按照奇数的方法来构造,而最后剩下的那一个数并不会影响异或和,因此最后只需要判断一下最后一个数是否与前面的数相等即可(因为异或和不会改变,所以我们不可能单独调整某一个数,因此如果异或和的条件不能满足那么整个过程就是无解的)。

  • 相关阅读:
    二级目录下的SESSION共享问题
    [Leetcode 65] 120 Triangle
    JMeter学习(一)工具简单介绍
    pycham破解方法——Mac上亲测成功
    jmeter目前发现一丢丢强大的功能(未完待续,需优化)
    jmeter实现请求返回参数利用到下一个请求中
    通用化case,拿走不谢——测试之路
    mac 下pip安装python三方库的时候提示 Could not fetch URL https://pypi.python.org/simple/virtualenv/: There was a problem confirming the ssl certificate:......
    sudo pip install MySQLdb找不到该资源的原因
    软件质量管理实践总结
  • 原文地址:https://www.cnblogs.com/mollnn/p/14022688.html
Copyright © 2020-2023  润新知