好了做了SDOI day1的3道题,来讲下做法及感想吧
T1:排序(暴力,搜索)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3990
我们可以很轻易的发现,对于一个操作方案,交换两个操作顺序不会影响答案,因此我们可以从小到大枚举答案,可以发现,对于第i种操作过后,每个2^i的块必须是连续的
那么在第i种操作之前,最多只能有2个块不连续,那么如果没有块不连续,不用执行该种操作;只有一个块不连续,交换这个块的两小块;两个块分4种情况讨论,用dfs暴力搜索即可
时间复杂度看上去是O(4^N),但好像可以证出复杂度其实是O(2^NlogN)N=20都能跑过
CODE:
T2:寻宝游戏(平衡树,dfn序)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3991
这道题真的想不出来啊= =
贴下同学的题解吧= =
大概就是这样子的,看上去还是非常的形象的,但我根本没想到啊QAQ
T3:序列统计(FFT)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3992
这道题分明就是原题好不好= =
首先我们可以很容易的写出状态转移f[i][[j*a[k]]+=f[i-1][j];
30%的分数可用矩阵乘法优化
我们取下离散对数(就是mod m意义下的),然后这个方程就变成了f[i][ind[j]+ind[a[k]]]+=sigma(f[i-1][ind[j]*cnt[inda[k]])
可以发现变成了卷积形式了,好像可以用fft优化了
但发现n很大
借鉴一下矩阵乘法的优化,可以发现多项式乘法满足结合律,那么我们可以愉快的学习快速幂的形式,变成f0*cnt^n次方了
时间复杂度是 mlogm logn完美解决本题
还有一件事,求离散对数可以不用大步小步法,因为p很小,可以直接p^2求出来
顺便提下原题是lydcjj(greenclouds)的kpmcup#1中的T1(ORZ),除了取离散对数其他都一模一样的
要不是做了MX的组合数和看过云神的题,还真不一定做得出来
总结一下:
作为省选题,还是很不错的
思考复杂度都不低(虽然有人说3道都是原题QAQ,自己还是太弱)但是编程复杂度并不高,前两道都能秒,第3道套个fft模板也能秒
还是这种考思维的比较好玩,像陈老师这种业界毒瘤的数据结构题真是丧心病狂(づ ̄ 3 ̄)づ