JSOI2015 round2/round3题解

本文深入解析了JSOI2015竞赛中多个题目,包括子集选取、送礼物、字符串树等问题,详细阐述了解题思路与算法实现,如分数规划、单调队列维护、拓扑排序等高级技巧。

bzoj4475: [Jsoi2015]子集选取

分开考虑每一个数在哪些位置选了
如果用纵列来考虑,即一列一列考虑放了多少个的话
我们发现,第一列选择了 i i i个位置时,第二列只能选择不超过 i − 1 i-1 i1个,以此类推
那么其实相当于要选出若干不相等的数
所以一个数的贡献就是 2 k 2^k 2k n n n个数的总贡献就是 2 n k 2^{nk} 2nk

**bzoj4476: [Jsoi2015]送礼物

首先分数规划,然后一个 l o g 2 log^2 log2的算法就显然出来了…由于我常数太大所以跑不动
我们观察题目的限制,在大小在 [ L + 1 , R ] [L+1,R] [L+1,R]的串,显然左右端点分别是最大最小值时是最优的,否则一定可以去掉某一个位置使串长减小而贡献增大
当然对于长度为 L L L的串不一定以最大最小值为端点,所以这个暴力rmq做一次
不妨设右端点为 m x mx mx,左端点为 m n mn mn,然后反过来做一次
式子推一下就是 ( a [ r i g h t ] − a n s ∗ r i g h t ) − ( a [ l e f t ] − a n s ∗ l e f t ) > = a n s ∗ K (a[right]-ans*right)-(a[left]-ans*left)>=ans*K (a[right]ansright)(a[left]ansleft)>=ansK
枚举右端点,用一个单调队列维护 a [ i ] − a n s ∗ i a[i]-ans*i a[i]ansi的最小值
注意这里有一个地方卡住了我…就是如果这样选择的话,右端点可能不一定能取到最大值的位置,左端点也不一定能取到最小值的位置。那与我们的规定违背啊…但是注意到,我们串长在 [ L + 1 , R ] [L+1,R] [L+1,R]时,一定是左右端点在最大值与最小值的时候时最优的,所以如果使得左右端点不合法的情况,这种情况是一定不优的,所以不会对答案有影响…

bzoj4477: [Jsoi2015]字符串树

贴一下以前的辣鸡题解

bzoj4481: [Jsoi2015]非诚勿扰

这题嘛…不会等比数列求和也没关系
我们发现要求是double输出
那么可以知道, 0.6 0.6 0.6最多就给你跑个 80 80 80次就约等于 0 0 0
于是直接对于每个人暴力算概率
然后树状数组求和

bzoj4482: [Jsoi2015]套娃

式子拆一下的话每个套娃的贡献就是
i n [ i ] ∗ B [ i ] − o u t [ i ] ∗ B [ f a ] in[i]*B[i]-out[i]*B[fa] in[i]B[i]out[i]B[fa]
那按 o u t [ i ] out[i] out[i]大小从大往小排序,选择能放的最大的 B [ i ] B[i] B[i]作为套在他上面的
正确性显然

bzoj4484: [Jsoi2015]最小表示

用一个bitset维护每个点 i i i能去到的点
然后跑一遍拓扑序
对于每一个点,在扫到他之后
我们按拓扑序从大往小扫与他有边相连的点,这里大的指后被扔进队列里的意思
然后如果一个点和当前这个点能去到的是一样的,那么这条边显然可以被扔掉
因为拓扑序大的显然是不可能被拓扑序小的给访问到的,所以正确性显然

bzoj4485: [Jsoi2015]圈地

最小割
S向一个人的地连边,另一个人的地向T连边
然后相邻的地连无向边
这样显然可以保证如果两个人选择了相邻的地,那么有一堵墙会被修起来

bzoj4486: [Jsoi2015]串分割

可能略微有技术含量的一题?
首先我们先知道如果比较两个大数
先跑一遍SA,然后比较后缀的排名
哈希先判这两个数是否完全相同,否则就是排名较小的那个小一点
然后显然可以知道最大那个数的长度是多少,就是 ⌈ n k ⌉ \lceil \frac{n}{k}\rceil kn
那么我们把这样的 n n n个数拿出来,排个序,二分答案
贪心的想,每次当然选能选的最远位置去切割
可以注意到,合法的开头只有 ⌈ n k ⌉ \lceil \frac{n}{k}\rceil kn个,并且每次最多跑 k k k次匹配
那么复杂度就是优秀的 n l o g n nlogn nlogn

bzoj4487: [Jsoi2015]染色问题

n 3 n^3 n3可过那就直接 ( − 1 ) k (-1)^k (1)k容斥
枚举 n , m , K n,m,K n,m,K表示至少缺少了多少行/列/颜色
直接算就过了…

bzoj4488: [Jsoi2015]最大公约数

如果固定一个左端点,那么 g c d gcd gcd不同的右端点只有 l o g log log
预处理每个点向右最多能去到哪个使得这一段 g c d gcd gcd都相同的点
直接暴力跳就可以了

bzoj4489: [Jsoi2015]地铁线路

咕咕咕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值