13年7月13日CF练习 Codeforces Round #147 (Div. 2)

时间:2024-01-12 08:17:50

这场div2可以说是我见过的比较水的一场吧。基本都是一眼题。

比赛地址http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=1836

题号是237A-237E

A题:Free Cash

这题不能多说。就是每个分钟覆盖一下,算出最大就行。

B题:Young Table

题目中有一个很重要的条件是,操作的个数不大于这些数的个数就行了。

那么很明显的一个想法就是,第一个位置放1,第二个位置放2,依次类推,最后肯定能满足条件。

复杂度应该是n^2的。

C题:Primes on Interval

首先看到数据范围是10^6

然后看到求最小。

很显然的一个想法就是二分判断可行性了。

二分L的大小,带入数组中判定。

不过有一点需要注意

就是算某个区间[x,y]有多少个素数,你只要事先记录好[1,x - 1], [1, y]区间内的素数,然后一减就行了

D题:T-decomposition

目测大家都没看题。 前边都在墨迹

题目大意就是

给了一颗树s,然后让你构造一个树叫t,

t这颗树比较特别,就是这颗树上的结点都是由树s上的若干结点构成的集合。 并且t树上所有结点的并集是s树的结点的全集

并且,如果s上有边(a,b)那么t树上必须有某个结点,包含a和b这两个点。

最后一条,如果t树上有两个结点x,y,若x中包含了s树中的结点a,且y中包含了s树中的结点a,那么t树中,x到y的路径上的结点都必须包含s树中结点a

然后规定某个结点的基数就是它所包含的s树结点的个数,然后整个树的基数就是所有结点中最大的基数

现在就想让树的基数最小。

最后输出的是t树中每个结点包含了哪些s树中结点,以及t树中的边

这个需要手画一下。

然后不难得知,其实只要把s树中的每条边得两个结点,作为t树中的新结点即可

就是一个边对应一个结点

然后连接的方法类似于多叉树转换二叉树

我们先把每个边对应成一个结点。

我刚开始的想法是把根节点的儿子们与根组成的边对应的结点依次连接起来,然后其他结点的(儿子们与其父亲的边对应的结点)都跟(父亲结点与父亲的父亲结点组成的边对应的结点)相连

后来发现,只需要:

每个结点的儿子们与其父亲组成的边所对应的结点依次相连,(大儿子连二儿子,二儿子连三儿子)

大儿子与父亲组成的边对应的结点还要与(父亲结点与父亲的父亲结点组成的边对应的结点)相连

当然如果往上没有父节点了就不用连了。

然后就很能满足题意了

E题:Build String

题目大意也比较清楚

就是给你一个目标字符串。

然后给你n个准备好的字符串。

然后每次操作,你可以从这n个字符串中任意挑选一个字符,然后从对应的字符串中删掉这个字符,把这个字符写在纸上。

循环操作直至你的纸上构成了目标字符串

限制就是每个字符串都有花费,第i个字符串取一个字符的花费是i,然后能取得次数是分别有限制的,为ai

看完之后就能发现。。 这不就是最小费用最大流

其中最大流就是目标字符串的长度

我们这样建图:

一个超级源点,一个超级汇点,

中间分为两层,

第一层有n个点,代表了100个字符串

第二层26个点,26个字母

源点向每个第一层的点连边,花费为0,流量限制为该字符串能取的次数

然后对第一层的每个点,对应的字符串,计算每个字符的个数,然后与相应的字母连边,流量限制是字母的个数,每个流量的花费是(若是第i个字符串就是i)

最后每个第二层的点向源点连边

流量限制分别为目标字符串中该字母的个数,花费为0

然后跑一遍最小费用最大流,检查流量是否是目标字符串的长度,如果是,表示可以构成目标字符串