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条满足条件的边”的答案就用剩下的边从小往大加来更新答案。

绿绿的情况分别搞一下。

注意图可能不连通。

posted @ 2018-08-04 21:27  iot;  阅读(491)  评论(1编辑  收藏  举报
知识共享许可协议
年轻人,你需要更多的知识