2018"百度之星"程序设计大赛 - 资格赛 - 题集
1001
$ 1 \leq m \leq 10 $
像是状压的复杂度。
于是我们(用二进制)枚举留下的问题集合
然后把这个集合和问卷们的答案集合 $ & $ 一下
就可以只留下被选中的问题的答案了。
之后扫一遍随便判一下重。
1002
非空子串中字典序最小的子串长度一定是 $ 1 $ 。
咱们就记录一下每一个字母出现次数的前缀和,
每次询问就找到出现过的最先的那个字符就星了。
1003
整数规划好像是个NPC问题,
所以我们肯定不能直接上整数规划。
咱们来尝试把问题转换一下。
n=2
x1---y1
\ /
X
/ \
x2---y2
看起来像是个二分图。
二分图我们可以想到什么呢?
KM算法。
它有一个奇特的性质,
就是假设 $ x_i $ 和 $ y_j $ 被一条边 $ a_{i,j} $ 匹配上,
那么 $ x_i $ 的标签 $ l_i $ 和 $ y_j $ 的标签 $ r_j $ 有这样一个式子是成立的:
$ l_i + r_j \geq a_{i,j} $
题目要求 $ l_i + r_j \leq a_{i,j} $ ?
把它变成 $ - l_i - r_j \leq -a_{i,j} $ ,
然后硬上KM就好了。
注意标签的初始值。
1004
如果你有好办法,
请教教我这个蒟蒻吧。
1005
我们先想一下动态规划。
设 $ f_{i,j} $ 表示以第 $ i $ 个数打止的长度为 $ j $ 的上升子序列个数。
首先 $ f_{i,1} = 1 $ 。
然后也可以知道 $ f_{i,j} = \sum{f_{k,j-1}} , k < i \quad \mathrm{and}\quad q_k < q_i $ 。
这可以用一些树状数组来帮助它转移。
但是 $ 1 \leq n \leq 10000 $ ...
注意一下这句话。
你可以认为给定的排列是从所有 1,2,...,n 的排列中等概率随机选出的。
如果是随机数据的话,我们可以得知,
它的最长的lis不会太长。
可能长度只有几百也说不定。
1006
要答案最优的话,
就先只用条件中给定的2种颜色跑一遍最小生成树,
然后“恰好k条满足条件的边”的答案就用剩下的边从小往大加来更新答案。
把红绿和绿蓝的情况分别搞一下。
注意图可能不连通。