HNOI2015题解

奇了怪了我上次发的题解怎么不见了?
题意自己戳链接……

Day 1

HNOI2015 Arthur

思路:期望DP
直接DP是死也D不出的
转化一下
令f[i][j]——第i张卡在第j回合发动的概率
得到状态转移方程:
f[i][j]f[i1][j](1pi1)j+f[i1][j+1](1(1pi1)j+1)
这样下来,答案就为:
ni=1rj=1f[i][j](1(1pi)j)di
时间复杂度:O(Tnr)

HNOI2015 Fruit

思路:DFS序+整体二分+线段树
设pos[x]——x在DFS序中的位置
我们将水果转化为二维平面上的点(x,y),则有:
每个盘子可以接到的水果为二维平面上的若干矩形:
对于盘子(x,y),不妨设deep[x]< deep[y]
若x为y的祖先,则该盘子可以接到的水果满足:一个端点在y的子树内,另一个端点在x的子树外
否则可以接到的水果满足:一个端点在x的子树内,另一个端点在y的子树内

如果在这里套上树分治,可以将矩形规模缩小到P*logN
(Orz考场上N*log 3 N水过的matthew99爷)
不过我们直接使用DFS序(pos[x],pos[y]),可以将矩形规模缩小到2
于是问题变成,二维平面上若干矩形和若干询问点,对于每个询问点求覆盖它的矩形的第k大,可离线
在线算法挺麻烦的……
整体二分即可解决问题
对于区间[l,r]内的矩形,我们考虑[l,mid]对每个询问点的覆盖次数
若覆盖次数超过对应的询问k,则说明答案在[mid+1,r]中
否则说明答案在[l,r]中
将询问点分成两份后,递归处理即可
时间复杂度:O(Nlog 2 N)

HNOI2015 Dishes

思路:优先队列+字典序
首先排除无解情况
若给定优先顺序出现环状,则说明无解
否则我们考虑整个序列
在1最优先的情况下,使2最优先
将整个序列倒过来,则有:
在1最后的情况下,使2尽量靠后
显然:字典序最大

将整个图倒过来建
每次取可行的最大解加入答案
最后将答案倒序输出即可
时间复杂度:O(NlogN)

Day 2

HNOI2015 Maple

思路:DAG上DP
di 为i点的入度
对于一个DAG,我们会发现答案为 ans=Πni=2di
麻烦的就是多了一条边
这时我们会发现答案增大了
这些增大的方案为那个新边构成的环数
设新边为(x,y),我们可以DP求得增大的方案数
f[i]——y->i对答案的增大的数目
显然: f[i]=j>if[j]d1i
初始状态: f[y]=ansd1y
答案: ansf[x]
在模质数下可将除法转化为乘法逆元
时间复杂度:O(N+M)

HNOI2015 Shop

思路:可持久化树分治结构
其实没有思路上说的那么复杂……
如果是离线的话,直接一个树分治就搞定
然而题目强制在线,不过每个点度数不超过3

假设Q=1,我们只需一次树分治
若Q=100,我们可以进行100次树分治
然而Q=200000……
不怂,我们考虑每次树分治
我们会发现,每次分治选出的重心都是一样的
我们将这些重心拎出来,重新构成一棵树
我们称之为分支结构树
显然,这棵树的深度不超过logN
对于每个询问,我们发现,只有在分治结构树这个点和它的祖先的答案对这个询问有答案贡献
如果度数>3,我们就需要一个可持久化数据结构来维护每个重心在分支结构树中的答案
不过这个题度数小,我们可以开3个vector,然后直接合并答案
这样我们只需在分治结构树中计算这个点和它的祖先的答案即可
时间复杂度:O(QlogN)

HNOI2015 Pairwise

思路:树形DP
首先将相等的缩成一个点
然后考虑无解状况,类似Day1 T3
设:一个序列的长度为’<’个数+1
对整个森林进行DP
f[i][j]——以i为根的子树产生的长度为j的序列个数
状态转移方程:f[i][j]=合并f[son[i]][k]
这个合并可以利用背包解决
问题转化为,对于一个长度为x的序列和一个长度为y的序列,将其转化为长度为z的序列共有多少种方案
根据基本组合知识可以知道: (xz)×(x+yz     x)
时间复杂度:O(N^4)

你可能感兴趣的:(各类比赛)