BestCoder Solution
1001 Fxx and string
枚举i和等比数列公比q,但考虑到q有可能是1/t的形式,所以倒过来枚举一遍就可以了。
1002 Fxx and game
设Fi表示将i变为1的最少步骤,如果k∣i,Fi=min{Fj,Fki},否则Fi=min{Fj},其中i−t≤j≤i−1。
用单调队列维护一下就好了。
时间复杂度O(n)。
1003 Fxx and tree
考虑从上往下贪心,要将整棵树翻白,有唯一的方案。于是我们只考虑翻了多少个正确的点。
设fx表示还有n−x个正确的点没有翻需要的期望步数。注意到翻到一个错误的点后,必须要再翻一次这个点才能挽回。于是我们可以列出一个方程。
f_0=f_1+1,f_i=\frac{i}{n}f_{i-1}+\frac{n-i}{n}f_{i+1}+1,f_n=0
用高斯消元求出解就行了。每组数据复杂度O(n3)。
1004 Fxx and factory
假设经过一轮操作后本来从左到右第i个桶变为了第pi个,我们将n个桶抽象为n个点,并在所有的i和pi中连一条边,那么我们一定会得到若干个环(包括自环)。
由第一类斯特林数可以证明当3操作无限时,环的数量是log(n)级别的。又由于3操作数量对于n的数量是很大的且数据随机,所以我们可以得到在本题中环的数量是log级别的。
对于每条i−>pi的边,这条边上有若干1,2操作,对于每条边我们记录两个量flag,val,flag=0表示这条边有没有2操作,否则表示有,val 表示这条边最后一个2操作后所有1操作的加数的和。
现在来考虑每一个桶,经过k轮后的值,其实就是在图上的一个点经过k条边,如果这k条边的flag都为0,那么我们直接把这k条边的val相加即可,否则我们把最后一个flag=0的边之后的val相加即可。
那么我们现在就可以对每一个环预处理出经过1−len轮后的最大值,len为环的长度,这个直接用数组记录就好了,当k>len时,我们可以由k%len和lenk得出来。
查询的话直接扫每一个环就行了,总复杂度O(n2+Qlogn)
Read full article from BestCoder Solution
No comments:
Post a Comment