您的位置:首页 > 其它

NOIP2017提高组模拟22-雅礼国庆10.5

2017-11-03 20:39 369 查看
T1

题意:有m(<=1e4)层边,每层有k(<=10)个点,第一层只有一个点S,最后一层只有一个点T。然后整个图是一个DAG,可以一次取反相邻两层的边,问有多少种方案使得最后的S到T的路径数为偶数,有模数。

题解:用f【i】【j】表示做到第i层,路径数的奇偶性情况为j,如果是偶数为0,奇数为1。最后把状态中1 的个数为偶数的累加即可。

代码:http://paste.ubuntu.com/25879093/

T2

题意:给定n+1(n为偶数)个01串,每个串长度为2n,有n个1。

找到任意两个串,使得交的1的个数大于等于n2

题解:想想直接暴力做,是O(n364)的。但分析一波发现其实很难构造出跑满的数据,因此直接上,中途找到一组直接输出即可。

正解是随机……

代码:http://paste.ubuntu.com/25879353/

T3

题意:给定一棵树,在某些节点放一些灭火器,每个灭火器最多灭S(<=1e9)个点,每个点最多被隔K个单位距离的灭火器灭,问最少要多少个灭火器。

题解:首先贪心将灭火器放在越高越好。

用 g【x】【i】以x为根 距离为i 的需要灭火器房间个数

f【x】【i】以x为根 距离为i 的灭火器个数

做完儿子后,f【x】【i】=∑f【v】【i−1】(1<=i<=K),g同理。

且g【x】【0】=1

i==K时,不能再往上传递了,必须全部灭掉。

所以若g【x】【K】大于0,则用足量的灭火器。

因为对于某个点,如果有若干个灭火器可以灭到该点,那么其实用子树内的灭火器更好。

然后我们发现每次往上传递灭火器,相对距离+2,所以i+j==K或K-1时,要把子树内能灭掉的先灭掉。

最后在把根节点能灭掉的都灭掉。

代码:http://paste.ubuntu.com/25879359/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: