A、配对游戏(loj6191)
题目:
分析:
g[i][j]表示前i个位置尽可能合并,合并到最后右边剩下j个>,这样情况的概率
那么g[i][j]=0.5*g[i-1][j-1]+0.5*g[i-1][j+1]
我们能不能根据概率来求期望呢?
emmmmm...有点困难,因为我们只知道每种情况下右边剩余>的个数,却不知道左边剩余<的个数
其实这两个是对称的,所以结果*2就行了
如果没发现这个怎么办呢?那就老老实实设期望
f[i][j]表示在g[i][j]描述背景下剩余个数的期望
那么f[i][j]=0.5*(g[i-1][j-1]+1*f[i-1][j-1])+0.5*(g[i-1][j+1]-1*f[i-1][j+1])
时间复杂度O(n^2)
B、城市网络(loj6192)
题目:
分析:
直观想法是要在树上维护一个可撤销的单调栈……但好像不太好弄……换思路
首先可以把询问(u,v,c)转换成u点下挂个点,这个点的点权是c
现在关键问题就是如何快速找到树上每个点的father,这个father是点到根路径上最近的比它大的那个点
可以这样搞,倍增求出fa[i][j]表示i的j级父亲,mx[i][j]表示i向上到j级父亲下面这段点的最大点权
那么就可以根据mx倍增走出每个点的最近父亲,然后对于新的父亲进行倍增
对于每个询问根据深度倍增就行了
时间复杂度O(nlogn)
C、神秘代号(loj6193)
题目:
分析:
n个点n条边构成的是一个基环外向树,那个环所表示的模方程正好首位相接,可以解出一个未知数xi的值
然后发现如果确定了一个点的值,那么其它点的值都可以通过bfs得到,并且不会冲突
注意可能有多个基环外向树
D、排列(loj6194)
题目:
分析:
我们通过saved的更新过程来考察所有排列
设saved的值按顺序依次是p[1],p[2]....,p[k]
我们首先来考察给定一个顺序p[1],p[2]....p[k]下,符合的排列有多少个
考虑相邻的p[i]与p[i+1],我们发现p[i]右上方的所有点必须排在p[i+1]后面
于是我们设a[i]表示点p[i]右上方有多少个点(包括自己)
那么符合条件的排列数有多少呢?我们先考虑简单情况,只有两个p[1] p[2]
那么问题相当于求n的带限制排列数,限制是有x-1个数字必须排在数字p[1]之后
考虑这x个数顺序完全固定,那么根据经典结论方案数是n!/x!
但实际上这x个数的后x-1个数是可以排列的 ,所以方案数是n!/x!*(x-1)!=n!/x
那么推广到一般形式,即k>2,发现集合是嵌套的
所以对于一个给定的p[1]....p[k],方案数就是n!/(a[1]*a[2]*a[3]...*a[k])
于是我们可以得出一个O(n^2)的递推算法
f[i]表示以点i为最后一个saved的方案数
那么f[i]=Σf[j]*inv(a[j]) (j在i的左下方)
很容易发现这个如何优化,这个本质就是求左下方的和
于是第一维排序,第二维树状数组
此题也很容易推广到高维,cdq分治即可