JLOI2015试题大意及部分题解

================Day1===============

T1:求 (b+d2)n 的整数部分对p取模后的值
其中 bmod2=1,dmod4=1,b2d<(b+1)2,n1018

思路:
构造数列 an=ban1+db24an2
其中 a0=2,a1=b
然后我们求出这个数列的通项公式,得到 an=(b+d2)n+(bd2)n
因此得到 (b+d2)n=an(bd2)n
由于 bmod2=1,dmod4=1 ,因此 db24 一定是个正整数,故我们可以利用矩阵乘法来求出这个数列的第 n
然后对于 80% 的数据 b2d<(b+1)2 ,对于 20% 的数据 b=1,d=5 ,因此 bd2(1,0]
故后面那一项对答案有贡献当且仅当 db2 n 为偶数
时间复杂度 O(log2n)

TMD我居然看错题了= = 我居然没有看到【整数部分】这四个字= =
当我反应过来这道题的意思时只剩20min了。。。20min。。。
我只能把 b100,n5 的40分交上去了QwQ
跪95pts的KuribohG……

T2:给定一棵树,每个节点是一座城池,有一个坚固程度 hi ,和两个参数 ai vi ,其中 ai{0,1}
m 个骑士,每个骑士有一个初始攻击力 xi ,从某个节点出发,沿该节点向父亲节点一路攻克
当骑士到达某个节点时,若骑士的攻击力小于城池的坚固程度,骑士将会牺牲在这个城池,否则骑士的攻击力将会发生一个变化并继续攻略这个节点的父亲节点。攻击力变化如下:
若该节点的 ai=0 ,那么骑士的攻击力将会增加 vi
若该节点的 ai=1 ,那么骑士的攻击力将会乘上 vi
数据保证当 ai=1 vi>0
注意不同骑士的攻击是相互独立的,你可以认为这 m 个骑士存在于 m 条不同的世界线中。
最后输出每个骑士牺牲在了哪座城池(未牺牲输出0),以及每座城池中牺牲了多少骑士

思路:由于攻克一个城池之后骑士之间的攻击力大小关系不变,因此我们可以维护一个可并堆来维护每个城池中的骑士
对于每个节点,首先将所有儿子节点上的可并堆合并过来,然后将 <hi 的堆顶弹掉,然后搞一搞标记就好了

这题不难啊= = 似乎只有我一个AC的= =?(不知道聂恺辰Rejudge之后的细分= =
18357写了个Splay启发式合并调了3h然后爆零。。。
wyfcyx写了倍增不知道为什么也爆零了。。。
【wyfcyx:等代码发下来之后你们看看我代码就知道怎么回事了】
= =

T3:给定 n 个武器,每个武器有 m 个属性和一个价格,如果一个武器的属性可以被其它几个武器线性表示,那么B君就不会购买这个武器,求最多买多少武器以及买最多武器的前提下最少花多少钱
n,m500

思路:
裸拟阵……
维护线性基,将武器按价格排序,从小到大塞进去,如果能塞进去就买,塞不进去就不买

精度问题?卡了10pts
其他人最高30分……
这是裸题啊……

于是230分拿到Rank1= = 第二150。。。

================Day2===============
T1:求有多少个 n m 列的矩阵满足每个数都在 [0,m] 之间且 ai,j<ai,j+1,ai,j<ai1,j+1

思路:
把互相有大小关系的点对连上一条有向 容易发现任意一条边都在至少一条长度为 m 的链上 而取值最多有 m+1 个,因此任意一条链上最多有一条边两端的点相差2
然后转化一下就变成了这样一坨东西:
JLOI2015试题大意及部分题解_第1张图片
如图,只能向右和向上走,求从左下角走到右上角不跨越两条对角线的方案数

……很不幸我只会处理 nm 的情况= = n>m 的情况貌似很复杂?
反正搞到了50分= = 暴力60= =

UPD:扒了一下午毕姥爷的标程之后终于看懂怎么做了QAQ
首先我们考虑用方案的全集减掉跨越了的方案
如果用全集-跨越第一条的方案-跨越第二条的方案+两条都跨越的方案
第四种情况将会十分难以计算
(官方题解中写的 Cn2n+m 是不对的!~)

我们画两条辅助线 分别是直线 y=x+1 和直线 y=x(m+2)
为了方便我们称这两条直线为A和B
那么容易发现如果一种方案不合法 那么路线一定触碰了直线A或直线B
但是触碰的情况可能非常复杂 比如ABABBABBBAA啥的= =
为了避免重复计数我们把相同的都缩掉 变成ABABABA这样的串
然后怎么搞呢?
我们令初始点为 (n+m+1,n) ,然后我们做这样的操作:
将当前点沿直线A翻转,然后把原点到当前点的方案数从答案中扣除;
将当前点(注意此时已经翻转过了)沿直线B翻转,然后把原点到当前点的方案数从答案中加回来;
反复如此直到某一坐标 <0 此时无论如何进行下去方案数都是0了
这样做相当于把以A和AB为后缀的方案删除,然后把以BA和BAB为后缀的方案加回去,然后把以ABA和ABAB为后缀的方案删除……
最后我删除了什么?没错,以A为前缀的所有方案!
然后我们先沿B翻转再做一次,就删掉了以B为前缀的所有方案
这样这题就在 O(n) 的时间搞出来了……
不得不说毕姥爷太神了QwQ

T2:给定一张 n1000,m3000 的图,每条边有边权,有 p10 个关键点,每个关键点有一个颜色,现在要求一个边权和最小的生成子图,使同种颜色的关键点互相连通

思路:
fS 表示颜色 S 的所有点构成的最小斯坦纳生成森林(其中 S 是颜色的集合)
那么我们首先我们先求出每个状态的所有点构成的最小斯坦纳生成树
然后跑DP
fS=max{fS,fT+fST|TS}
复杂度上界似乎是 (3pn+2pSPFA(n,m))2p2+3p2 ?
不过分析一下可以得到更好的上界
如果一种颜色只有一个点 那么这种颜色显然对答案没有贡献
因此极限情况应该是 p2 种颜色 每种颜色有两个点
那么我们做斯坦纳树的时候 其实复杂度应该是这样的(下面以 3p 项为例)
3p+C(p2,p21)3p2+C(p2,p22)3p4+...+C(p2,0)30
=10p2
因此最终的复杂度是 10p2n+5p2SPFA(n,m)+3p2
大概1E的复杂度……尊口怕呀尊口怕

UPD:我傻逼吧一遍斯坦纳树就能搞出所有颜色集合的最小斯坦纳树了为何要做 2p2 遍= =
复杂度 O(3pn+2pSPFA(n,m))

考场上判掉每种颜色都只有一个点的情况,然后无视颜色,斯坦纳树裸跑可以拿到90分
(我写的不好只拿到80分

T3:给定一棵满二叉树,每个点有AB两种状态,你可以任意指定,若某个节点和子树中的某个叶节点同时选择A状态会产生一个贡献,若同时选择B状态会产生另一个贡献,要求选择A状态的人不超过 m 个,求贡献总和最大
二叉树深度 10

题解戳这里
AC爷就是屌

我没写这题= = 没时间了

Day2就这样130滚粗了= = 然后我居然Rank2(3)?
18357凭借第三题的Accepted怒拿Rank1 跪跪跪跪跪

代码戳这里

你可能感兴趣的:(BZOJ)