2022.03.11省选模拟赛总结
更自闭的一场,比昨天没有一点进步,弱智错误有增不减。……
1.时间安排
7:30~7:50 看题面
T1:字符串hash可以搞5分,还有5分的规律,可以试试\(n^4\)。
T2:数据结构题,可以试着搞搞线段树或者莫队这类的。
T3:数学题或者是计数dp?不是很可做的感觉,签到就走人吧。
7:50~8:20
把T3签到。
顺手打个表找了下规律,把a=1,b=1和a+b=n+1写了就跑路了。
8:20~8:50
写T1的字符串hash,然后简单推一推规律写了全排列矩阵的分数。
试着跑n^4,结果跑了8s多,直接放弃,干T2。
8:50~11:00
先把签到写了,然后把K=1也顺手写了。
发现n<=2000可以套用n<=200的dp,用线段树优化一下预处理,对拍没问题。
发现K=2实际上就是求区间内连续奇数段的长度,简单用莫队搞一下,对拍也没问题。
但是
发现一个变量名len重复用了,在tester(测试程序)里面全替换干净了,但是在mycode(提交程序)里面没替换完……
白白丢掉17分,而且脑抽把K=2的优先级放在了n<=200前面,一共白给了28分(如果n<=2000也因为莫队优先级挂掉就只剩8分了)……
之后一直在分析k<=3有什么奇怪的含义,猜想可能是与3的性质有关(因为1和2都很容易讨论),然后陷入了深渊,一看表已经11点了……
11:00~12:00
想到了一个T1\(O(m^2n)\)的做法,按颜色端分类,但是假了,没有办法处理每个颜色在这一个限制长度下有多少段是相同的。
觉得能改出来,一直干到结束也调不出结果。
result:
T1:10 T2:27 T3:20
2.反思
T1:
签到20分的题。
原来我的时间复杂度是接近n^4logn的,忘了unordered_map常数巨大理论O(1)实际接近O(log),离散化一下解决一切问题……
思维还是太死板了,一直在思考怎么简化计算矩阵的答案,没想到可以转化为每一行可以在多少个矩阵内产生1贡献。
T2:
签到38分的题,本来能拿55挂飞了。
T2还是很可做的,势能分析还是见的太少了,就像昨天T3只会变换20次值一样,今天的与运算与昨天类似,也是最多log种取值,就可以优化时间复杂度到log了。
考场上一直在想k<=3有没有什么特殊的含义,谁知道竟然和k完全无关,被数据范围套路了。
T3:
混了个签到成绩。
满分做法是多项式就先放放,73分dp还可做。
3.简要题解
T1:
一句话题意:给一个n*m的矩阵计算每个子矩阵的本质不同的行数之和。
\(n * m\leq 5e5,元素\leq 10^9\)
转化题目:求矩阵每一行能在多少个矩阵里面产生1贡献。
把矩阵的每一行看做一个字符串,插到trie树里面,因为数字很大,用map存储。
在trie树的每个位置储存下来是那一行,在插入的过程中查找前驱后继,答案就死(pre-now) * (now-nxt),手推一下就发现这样计数是不重不漏的。这样就可以\(O(nm^2logn)\)解决。
但是发现所有的后继节点都是在一棵trie树的同一层上,所以对同一层的trie做一下合并,因为节点数很大所以要启发式合并,复杂度降低为\(O(nmlognlogm)\),可以通过。
T2:
一句话题意:给定长度为n的序列,m次询问l到r之间有多少个子段和按位与和是k的倍数。
\(n\leq 1e5,m\leq 5e5,k\leq 3\)
\(k=1/2\)是显然的,随便搞,但实际上这道题和k的取值一点关系都没有。
容易发现固定一个左端点后区间按位与的和最多变换logn次,所以考虑从后往前扫描,更新变换值的位置,就可以保证复杂度是O(nlogn)的了(m被均摊了)。
找到一个按位与和是k的倍数的区间就在线段树上更新一下就好了。
T3:
一句话题意:问有多少长度为n的排列满足从前往后看有a个最大值,从后往前看有B个最大值。
\(n\leq 2e5\)
考虑n一定是序列里最大的元素,所以考虑计数:
枚举n所在的位置i,在一共n-1个元素中挑i-1个放n前面,在前i-1个元素中放a-1个最大值,后n-i个元素中放b-1个最大值的方案数。即
求s[x][y]:
考虑在一个2~x的排列中插入一个1。
如果原来有y-1个最大值,就把1放在最前面,最大值数+1;否则就在有y个最大值的排列中在剩下x-1个位置里面填进去。即
直接递推就有了62分,还有11分可以打表出规律,不会多项式一共有73分。
发现s实际上就是第一类斯特林数。
考虑答案式子就是在找n-1个数先分i-1个数组成a-1个环,再分n-i个数组成b-1个环的方案数,转化一下就相当于先把n-1个数分成a+b-2个环,再从a+b-2个环调出来a-1个的方案数。即
套分治FFT求出第一类斯特林数后问题解决(但是我不会)。
4.总结
1.数据结构
总是考到的时候要么想不到,要么想到了一堆细节调不出来,第二种情况更致命。
还是要大胆去写数据结构,不能怕麻烦,写多了才能总结出这种数据结构适合解决什么,什么地方容易出错。
2.正难则反
既然直接计算矩阵本质不同的行复杂度减不了,就把角色互换,去统计行能在那些矩阵产生贡献,问题就迎刃而解。
本着简化问题的角度,如果枚举的东西很复杂而计算值相对简单,就试着交换,枚举要计算的值去找能对应到哪些情况。
除了交换枚举和计算,其他常见的还有全集-补集等转化,也是比较经典的正难则反的思维。
T3的dp也有正难则反的存在:既然1x-1的排列插入x很难讨论,不如转化为2x的排列插入1。
只要保证问题本质不变,就要试着用正难则反思考。

浙公网安备 33010602011771号