策略

总体:

1.挖掘题目性质非常重要,这就是解题的突破口,实在不知道时可以大胆猜性质,或想一个贪心,再用程序验证

2.前面题目做不出来不要慌,镇定很重要,也许后面的题目就是发现性质就好了

3.看到题目写完暴力之后也要反复检查,测数据,暴力一定要写对,能拿到的分要拿到,对于暴力已经写对的情况,就可以根据部分分进行数据分治,小数据先用暴力,因为不知道另一种写法是否正确,这样至少不会在这题0分

4.千万不能MLE,因为在考场里这种情况下这题就是0分,宁愿后面几个点RE

5.一定要多想想动态规划,因为一般都会有这方面的题目,一开始先不要管时间复杂度,一般动规写出来都会有很多分,后面会优化再优化,一开始不会写状态转移方程时就加状态,什么0/1的

6.写完暴力之后想想有没有什么很明显的优化,最好把所有优化都加上去,比如先排序,因为出题人不可能考虑到所有情况

7.实在不会才开始打表找规律,但小数据最好还是用暴力,因为有可能规律不对

8.尽量不要写自己不熟悉的算法,因为很多时候都会在一些细节出错

9.考虑某一个点(物品、边权、值)对答案的贡献,这种思想非常重要,在树形DP和一些计数类问题中也非常常用

10.排序过后一般都会有一些神奇的性质,根据什么来排序也很重要。以后发现数据没有规律时考虑排序,有时就会发现一些性质

11.如果原问题发现很难思考,可以先思考它的简化问题。比如多个数的情况可以先思考两个数的情况,然后就可以进行推广,比如先把其中的某些看成一个的思想,也可以根据小数据的结论猜测大数据的结论

 

2018.10.30

T1:今天第一题看到第一眼就用bitset,最后细节太多挂了25分。以后遇到这种纯模拟的题,反正时间肯定不会TLE,就直接用最直接的方法,越直接越好,因为一般这种方法细节较少,而且不容易错

T2:看到期望最先想到DP,一直在写状压DP,但不太会写,只得了8分。一定要先写暴力,不要最后连暴力都没时间写,全排列枚举是最直接、最容易想的,而且基本不会错。还有期望的原始定义式一定要记住,就是概率乘值,有时不一定是DP,直接算分子,最后乘分母概率的逆元也可以。

T3:最近最短路变形比较多,其实大多都是多加状态,跑最短路其实就是对状态的遍历和更新。状态不同但点相同的最短路也有可能不同。新加的维一般表示到当前这个点要记录的信息,根据题目决定。

 

2018.10.31

今天是三道计数题,做的有点不太舒服。

T1:看了好长时间题目,有点不太会写,这次知道用可行的方案数除以总方案数了,但可行的方案数不太会求。组合数的方法没想出来实在不应该。最终打表发现的递推式,以后还是尽量想解法,毕竟有时规律不是很明显,但实在不会一定要打表。

T2:交上去居然0分,本来是有20分的,但后来瞎改了一通,然后数组调小了,就RE了。以后写题目不同的数据点不同的算法之间最好没有数组重名,除非是大小功能都一样。还有有时明明知道第二种解法肯定不对,就不要交了,一般后面数据都很大,很难对。能拿到的分一定要拿到。

T3:只会10分,因为错排公式不会,公式推出来之后还是要发现它的收敛性质。最终的线段树也是比较奇怪,比较灵活,线段树可以维护的东西其实很多,仍需要加强灵活运用。

 

2018.11.1

这是几天来考的最差的一次,不过还是要感谢数据,要不然连这个分都得不到。

T1:立马意识到是容斥,式子也立马推了出来,然后发现组合数会爆long long,就卡住了。又去看看第二题和第三题,因为第一题没有做出来,看题也不太安心,以后一定要镇定,认真想,说不定什么时候第一题就想出来了,而且第二题或第三题满分也是可以的。回头又去看第一题,想着答案不超过1e9,就感觉应该是取模,就写了一下。后来不知道为什么感觉不对,把模数改成了比a1*n小的第一个质数,其实感觉也不对。最后因为数据水,幸运通过了。

T2:当时真的是一点思路都没有,感觉贪心又不知道怎么贪心。发掘题目性质真的很重要很重要,有时只是后来看起来一个很显然的结论,就是解题的突破点。一定要大胆猜结论,猜了也要用程序验证。这题主要就是越往后用魔法越优,还有要把所有节点瞬移到根节点,至少要用当前边数次的魔法。根据这两个结论就可以很好的写出代码。最后实在不会了,就输出了一个最大深度-k,居然拿了40分,感谢数据。这也说明了每一题都必须要交代码,就算它是错误的算法,但如果不交代码肯定就是0分,交了就有可能过几个点。其实这种题,可以多些几种贪心,最后取最小值作为答案,有时可以拿到很高的分数。

T3:真的是神仙题。只会写20分的暴力。其实应该有状压的部分分,以后要多写状压,因为2^n的状压还是要比n!的搜索要优的。100分的写式子,式子变形我感觉都非常难,这需要非常好的数学功底和对Σ和Π的性质运用地非常熟练。不过这题学会了一个求一个背包里删去一个物品的方法,还算是有收获的。

 

2018.11.2

好吧,今天才是最差的。

T1:还是式子立马推了出来,然后看了1个小时,怎么化式子都不能预处理。当时觉得自己数学是真的差,化式子都不会。其实也想到了杨辉三角,想到了左边那一列的和,但还是想着直接求和,看每一个出现多少次,显然是不行的。要打开思路,看看右边。现在又学会一个和组合数有关的结论,组合数的结论和性质还真的多。

T2:完全不知道题目在干什么,什么只有一个入度,联想不到任何算法。以后完全没思路就自动求特殊情况,比如这题最小生成树加一条边就是稍微好想一点的,虽然是错的。注意Kruskal的贪心,它可以用来解决许多图上的最优化问题,有时虽然不对,但也能骗到分。这题搜索不太会搜,后来直接输出No,本来以为有点的,后来发现没有这种点。其实这种题目一般无解的点都很少,基本没有,还是写搜索比较好。正解是基环树,自己的知识框架感觉还是有很多漏洞,需要抓紧时间补起来,比如动态规划和图论,都是经常考的东西。像有些问题只是一个模型,大概知道写过两三个题就赶紧过,保证考试时遇到和其有关的题目能有一个思考方向。搜索和大模拟也要多写,不能怕烦,锻炼代码能力。

T3:看到题目发现是字符串排序,立马想到字符串哈希求最长公共前缀,然后再比较,因为写过一道题目。其实还是前两题没有写出来,情绪不太好。如果静下心来想一想,其实很容易想到主席树来维护,下午一来就写完了,唉,为什么考场上就想不到。想不出前面题目一定不要慌,因为随便AC一题都可以拿到不错的分数,要认真思考,多发现题目隐藏性质。线段树类的数据结构还需要加强灵活运用。

 

2018.11.3

今天感觉还是不太满意。

T1:发现又是组合数。然后就开始搜索,测了几下感觉跑的还挺快,就没有继续想什么剪枝,其实是有可能TLE的,但数据水。最好加一下还剩的最小值和最大值,看是否在范围内,及时剪枝。

T2:唉,只有30分暴力分。最先想到了线段树的做法,但感觉时间复杂度没有保证。其实是有保证的啊,注意线段树里面如果询问区间包含当前整个区间就返回了,不需要递归到叶子结点,复杂度是O(logn)的,然后每个节点查询站台小于等于的也是O(logn)的,最坏也就O(log^2n),实际上远达不到。当时感觉复杂度不对就开始写CDQ分治,其实已经记不得了,只知道先排序,然后按时间分治,细节完全记不得。知识点还是有漏洞啊。不过没想到写一遍样例就过了,当时很开心,感叹居然写对了。后来才发现是样例水,后面的点一个都不对。以后还是不要写自己不熟悉的东西,写出来很容易错,错了就没分了。线段树当时如果写的好一点,分肯定比这个暴力分高。前面30分我是数据分治的,所以没挂,这也体现了数据分治的重要性,因为想出的感觉正确的算法不一定完全没有问题,这样至少保证这题有基础分。

T3:当时觉得T1、T2都想了出来,十分镇定的做T3。果然镇定是好的,比前一天看题清晰多了。感觉概率应该是这样算的,手推了一遍,的确是的。就开始写30分的暴力,写也写对了。然后时间还有半小时,就大概想想怎么优化,只知道会循环,完全不知道循环节是多少。看到k很大,就干脆只循环max(n,m)次,这样肯定不会超时,数据分治,反正不亏。测了一下,第二个样例都没过,安慰自己是因为n不等于m。最后交上去居然得了50分。这也提醒自己想不出来就大胆猜结论,自动减少循环次数,保证不超时的基础上尽量更对。这样有可能会多得一点分。

 

2018.11.7

T1:找规律找了两个多小时。。。手算了3和4的情况,发现了指数的规律,但前面还是有个系数,猜了一个指数的乘积,发现到5的时候就挂了。然后又想了一会,感觉猜不出来,就去看了其它题目,最后又回来看看,因为感觉快推出来了。用程序模拟算了一下5,果然还是电脑跑的快。这也提醒了我以后记得写程序来打表找规律,因为程序运行肯定比手算快,而且可以打多组数据,便于找规律。好不容易发现它是组合数。然后知道了大概的思路,从当前这个点到右下角的路径一共有C(n*2-i-2,n-2)种,向右就乘a,向下就乘b。所以说找规律的时候最好预估它和什么有关,这样找起规律来会好找一点,而且也有自信是对的。

T2:为什么最近的T2都感觉比较奇怪,好像基本上都是要发现题目性质,然后做法就比较简单,也没有什么高级算法和高级数据结构。所以说题目性质还是非常重要的,考的最后还是思维。今天的T2有点不太懂,大概就是先二分答案,判断能否达到这一组数。判断用动态规划。dp[i][j]表示已经考虑了前i个数,选了j个p之后最多能选择多少个q。然后枚举前i-1个数选了k个p,也就是当前选(j-k)个p进行转移。

T3:居然是原题。我暑假真的没有认真听啊,主要是题目没怎么写。就是求包含1号节点的最小环。注意图是无向边,但正反方向边权不一样。我只记得以前看过的先考虑1号节点的所有直接能到达的点,然后从这些点向1号点求最短路。最后发现它是不正确的,不过运气好过了50分。以后还是要大胆写。正解是什么二进制分组,就是根据1号节点相邻的点的二进制位分成两个组,一个专门连出边,一个专门连入边,最后跑Dijkstra最短路。暂时不太知道为什么是对的,只能先记住了。

 

2018.11.8

T1:又是结论题,感觉自己这种能力真的差。以后还是要多想想这种题,贪心真的是一种很重要的思想,有时虽然不会证,但有可能是对的,有时虽然是错的,但有可能过一些点。这种题如果原问题发现很难思考,可以先思考它的简化问题。比如多个数的情况可以先思考两个数的情况,比如这题三个数就可以先想两个数。两个数的结论非常显然,然后就可以进行推广,先把其中两个数看成一组。以后推广就可以使用这种先把其中的某些看成一个的思想,也可以根据小数据的结论猜测大数据的结论。

T2:拓扑排序。记住一件事情:map是根据key值建的平衡数,如果不是直接可以比较的类型(不是int,string...)要重载<,而且根据string比较时时O(n)复杂度的,所以最好转成字符串哈希用unsigned long long进行比较,比较就是O(1)的了。

T3:集合划分。DP的时候只能相邻的划分到同一个集合,所以元素排列的顺序非常重要,sort一遍就好了,不太会证,但以后还是要大胆猜测,排序过后一般都会有一些神奇的性质,根据什么来排序也很重要。以后发现数据没有规律时考虑排序,有时就会发现一些性质。这题发现答案可以用一个式子来表示,以后要多化式子,这是一种基本能力。当发现式子不好化时,考虑换一种枚举方式,用另外一个合式来表示。比如这题最好想的就是枚举点对,但也可以考虑每一个点到中央的最短路对答案的贡献,在考虑从中央到i的最短路对答案的贡献,这样就从枚举点对变成了枚举点,复杂度从O(n^2)变成了O(n)。考虑某一个点(物品、边权、值)对答案的贡献,这种思想非常重要,在树形DP和一些计数类问题中也非常常用。然后就是DP,考虑dp[i][j]表示前i个元素划分到j个集合里。dp[i][j]=min(dp[i][j],dp[k][j-1]+calc(k+1,i)),0<=k<=i-1,其中calc(k+1,i)表示第k+1个元素到第i个元素在同一个集合里的价值。

posted @ 2018-10-30 18:10  fluttersunny  阅读(137)  评论(0编辑  收藏  举报