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个最大值的方案数。即

\[\sum_{i=1}^nC_{n-1}^{i-1}s[i-1][a-1]s[n-i][b-1] \]

求s[x][y]:

考虑在一个2~x的排列中插入一个1。

如果原来有y-1个最大值,就把1放在最前面,最大值数+1;否则就在有y个最大值的排列中在剩下x-1个位置里面填进去。即

\[s[x][y]=s[x-1][y-1]+(x-1)s[x-1][y] \]

直接递推就有了62分,还有11分可以打表出规律,不会多项式一共有73分。

发现s实际上就是第一类斯特林数。

考虑答案式子就是在找n-1个数先分i-1个数组成a-1个环,再分n-i个数组成b-1个环的方案数,转化一下就相当于先把n-1个数分成a+b-2个环,再从a+b-2个环调出来a-1个的方案数。即

\[s[n-1][a+b-2]C_{a+b-2}^{a-1} \]

套分治FFT求出第一类斯特林数后问题解决(但是我不会)。

4.总结

1.数据结构

总是考到的时候要么想不到,要么想到了一堆细节调不出来,第二种情况更致命。

还是要大胆去写数据结构,不能怕麻烦,写多了才能总结出这种数据结构适合解决什么,什么地方容易出错。

2.正难则反

既然直接计算矩阵本质不同的行复杂度减不了,就把角色互换,去统计行能在那些矩阵产生贡献,问题就迎刃而解。

本着简化问题的角度,如果枚举的东西很复杂而计算值相对简单,就试着交换,枚举要计算的值去找能对应到哪些情况。

除了交换枚举和计算,其他常见的还有全集-补集等转化,也是比较经典的正难则反的思维。

T3的dp也有正难则反的存在:既然1x-1的排列插入x很难讨论,不如转化为2x的排列插入1。

只要保证问题本质不变,就要试着用正难则反思考。

posted @ 2022-03-11 13:56  Displace  阅读(77)  评论(1)    收藏  举报