BUPT 2022 Summer Training #1
链接:https://vjudge.net/contest/502699
A - Largest Triangle O
最大三角形,板子题,略
B - Hoppers O
题意
给定一张无向图,可以选定一个点染色,随后距离被染色的距离为2的点都会被染色。求至少需要向图中添加几条边使得选定一个点染色后可以将整个图染色。
思路
如果一个连通块是二分图,那么只能染色二分图的一部;如果一个连通块不是二分图,那么这个连通块可以被完全染色。
求出连通块的数量k以及是否有非二分图连通块,如果有非二分图那么只要用k-1条边把k个连通块连成一个非二分图连通块即可。如果没有非二分图那么用k-1条边连起来后还是个二分图连通块,需要再加一条边变成非二分连通块。
C - SG Coin O
略
D - Bitwise Ø
题意
n个数组成一个环,要求将这n个数分成恰好k个非空段,使得每一段的按位或的按位与最大。
思路
首先断环为链,按照常规套路把n个数复制一份接在后面,然后原来的k个非空段怎么处理呢?首先考虑断环位置是分割位置的情况,如果环上有k个满足题意的段,按照同样的分割位置,长度为2n的链会被分成2k段,每一段都是符合要求的;然后考虑断环位置不是分割位置的情况,这时候长度为2n的链会被分成2k+1段,但最左侧和最右侧的段是不完整的,不一定满足题意,我们可以把最左侧的段和其右侧的段合并,最右侧的段和其左侧的段合并,这样就得到了2k-1个满足题意的段。也就是说断环为链后至少有2k-1个满足题意的段。反过来,容易得到如果我们可以在断环为链后找到2k-1个满足题意的段,那么也就能在原来的环上找到k个满足题意的段。
现在解决链上的问题,为了简便下面记K=2k-1。如果我们只要考虑其中一个二进制位,问题就变得非常简单,如果能分出K段使得每一段里都有至少一个1的话那么答案就是1,否则答案就是0,这样的思路可以推广到考虑多个二进制位。
首先考虑最高位,我们不奢求直接求出最终答案,而是考虑最高位有没有可能为1,做法和上一段是一样的。接下来考虑下一位,为了保证结果最大,如果最高位有可能是1,那么在分的时候首先要保证每一段的最高位都存在1,其次才考虑次高位。
以此类推,在考虑某一位的时候贪心地看能否分出K段使得当前位和之前所有可能为1的位全为1,如果可行就说明答案中这一位为1。可谓是大贪心约束小贪心,让小贪心不会捡芝麻丢西瓜。
F - Wi Know O
题意
给定一个数组a,求字典序最小的(a, b),a≠b,使得数组中存在形如 a b a b 的子序列。
思路
从左往右扫一遍求出每个数的前一个相同的数的位置,记为数组last。然后从右往左扫一遍,如果当前扫到a[i],那么下标大于i的数中last值在[last[i]+1, i-1]范围内的都能和a[i]组成合法二元组,于是我们需要找到下标大于i的数中last值在[last[i]+1, i-1]范围内的a最小的元素。建立一棵线段树,单点修改区间查询即可。
G - Rectangular City Ø
题意
给定RxC的矩阵,要求选出n个子矩阵使得这些矩阵的交的面积不小于k,求方案数。
思路
行和列是独立的,所以可以分开成两个一维问题处理:在一个长为L的线段中选出n个子线段使得这些线段的交的长度不小于t。如果线段的左端点有a种选择,线段的右端点有b种选择,那么可以得出方案数为\((a^n-(a-1)^n)(b^n-(b-1)^n)\),最后合并两个一维问题的答案即可。
J - Free Food O
略
K - Conveyor Belts Ø
题意
一个工厂的生产线可以当成一张图,共有n个节点,节点之间由一些传送带连接。任何一条传送带都可以用恰好1s把东西从一个点运到另一个点。传送带是有向的,且一直在工作,物品到达起点后立刻就会上传送带。现在1~K号节点是生产节点,N号点是汇点。在第xk+i(1<i<K)秒时第i号节点会产出一个东西,循环往复。每个节点有一个机器人可以对东西进行识别,并把它放到某个传送带上,对从同一个生产节点生产的东西只能有一种分配方案。现在目标是把所有东西都运送到N号节点,但因某种原因要求任何时间点任何传送带上最多只有一个物品。问你最多能让几个生产节点工作,使得存在一种机器人分配方案,保证所有物品都能稳定被运输到N点的同时任意时刻任意传送带上的物品不超过一个。
思路
这题突出一个谜语人,好多地方都没说清楚。
首先我们可以感觉到这题和网络流有关,因为“传送带上不能超过一个”和“求最多生效的生产节点”以及“存在汇点”等条件存在明显的暗示。但直接开图不行,因为存在时间因素。同一个传送带上在不同时间有两个不同物体是可行的。那么我们把整个图复制很多很多层,每个时间点开一层,每层点连边往下一层连,那么就可以把时间因素考虑在内。
比方说,原本是1->2,
那么新图就是:1(第一层)->2(第二层),1(第二层)->2(第三层),……
显然时间是无限的,但我们不能连无限多层。由于生产节点工作的循环特性,我们一共开K层就可以了。把第K层连到第一层,刚好形成循环。
最后再设立一个超级源点和汇点,源点向第一层的1号点,第二层的2号点,……,第K层的K号点连流量为1的边。每一层的N号点向汇点连流量为正无穷的边即可。
最后直接跑最大流。dinic不行,EK可以。不知道什么原理。好像还有个ISAP不知道行不行。

浙公网安备 33010602011771号