NOIP2015总结

day1t1

直接模拟,它说什么你照着做就好了。最终得分100分。

day1t2

考场上秒出判环,然后开始打并查集,至今不知道当时哪里打错了,连小样例都过不去,最终交了一个奇怪的模拟上去。最终得分10分。

这道题考察判最小环,暴力也好,并查集也好,tarjan也好,只要是判最小就行。(注意是最小!!不是第一个!!)

day1t3

语文神题……现在想想,其实题目没歧义,不得不鄙视自己的语文水平……

由于NOIP数据随机,直接暴力搜索就好,注意一些优化:

1.炸弹和三带一是一回事,不需要重新搜炸弹。

2.由于数据中没有5,6,7,8,9的点,可以证明要出三带零的时候有其他的出牌方法可以代替,不需要搜三带零。

3.显然有张数的数码可以记录下来,然后可以做一个最优解优化。

当时考场上没管这么多……最终得分50分。

day2t1

noi题库原题,二分答案+贪心判断可行性。最终得分100分。
贪心地时候,对于每块石头,判断它与前面最后一个留下来的石头之间的距离是否大于当前的判断值,大于了就搬走,否则将最后一个石头更新,最后判断搬走的石头是否小于m。

day2t2

DP是我的弱项……(虽然一眼秒出DP)考场上列了张表都没想出来。最终得分10分。
设f[i][j][k]为用第一个串的前i位,分k个部分匹配第二个串的前j位。
如果第一个串的第i位与第二个串的第j位相同,那么可以把这一位算到前一种分配方案中去,也就是说方案数可以加上第一个串前i-1位,分k个部分匹配第二个串的前j-1位的方案数。
即f[i][j][k]+=f[i-1][j-1][k]。
还有一种,就是把这一位新分配一个方法,即这个方法就是分配且只分配了第一个串的第I位和第二个串的第j位(前面的分配方法不需要管),也就是说方案数可以加上第一个串前j-1~i-1位分k-1个部分匹配第二个串的前j-1位的方案数。
即f[i][j][k]+= i1l=1f[l][j1][k1]
然后就没有了。
显然这样做的话时间复杂度O(n^4)。
不难发现后面的那个操作类似于前缀和?
于是我们记录一个g[i][j][k]来表示f[1~i][j][k]的和。
时间复杂度减为O(n^3),可过,但是空间复杂度为O(n^3),然后发现这题卡了空间……
我们发现,每次f[i]都只与f[i-1]有关,于是把第一维取掉。
j还是从小到大循环?
如果继续这么循环的话,f[j][k]表示的就是f[1~j][k]的和了。
感觉跟什么有点像?
没错,01pack!
考虑把j倒序循环,每次就只加了一遍f和g了,复杂度不变。
这样的话时间复杂度为O(n^3),空间复杂度为O(n^2),看起来没什么问题了?
然而UOJ上这里写图片描述
恶心的hacker卡了一发常数……不过官方数据过得还是绰绰有余的了……
然后解决方法是对取模操作改为if(f[j][k]>=mo)f[j][k]-=mo;if(g[j][k]>=mo)g[i][j]-=mo;

day2t3
应该很容易看出来树剖吧……?然后考场上懒得写咯……写了个暴力,最终得分30分。
然而正解并不是树剖……我也不会正解的方法……这里贴一个80的方法吧。
首先把视线转移的特殊约定上……
看到了一条链的数据有40分,只有一个运输计划的数据20分,还有tarjan暴力20分。
实际上所谓的80分方法相当于打三个程序……
先打个tarjan,再来想其他的(注意出题人丧病卡常至少要getchar……)……
只有一个运输计划的数据怎么做呢?
直接把耗时最多的一条路改为0就好了咯……
然而重点在于这有40分的一条链数据。
是不是感觉答案具有单调性?
然后考虑二分答案+求交集判可行性。
我们把需要经过的比当前的二分值大的时间的计划全拿出来,然后求交集,如果求出的交集跟现在新找到的这个计划不存在交集就可以直接退出false了,(显然只能改一条边的时间的话会爆炸咯)然后把交集中最大的那条边改为0,再O(m)扫一遍,复杂度mlogm可以过掉。
最终的结果自然是爆炸了咯……连省一都没有……明年加油吧!

你可能感兴趣的:(总结,noip,uoj)