好久没写题解了,感觉很多好题没留下什么就这么过去了,着急改题很多细节和原理都没有注意到,思考也不够(考得越来越差),所以还是很有必要写的。
A. math
看到后的确没什么可接受复杂度的思路。直接说做法吧。
70%:O(nk^2)
把每个ai看成一组,由(ai*bi)%k知每组最多有k个物品(循环节),然后问题就转化为一个分组背包,看有多少个<k的非负整数能被凑出。
由于循环节长远不到k,所以骗到了70分。。。
70%:O(nklogk)
观察到上面对每个物品都要遍历一次容量,而很多容量是无用状态。最明显的,对于一个组内的物品,其实是一个物品重复放很多次而算作一次。
然后我们可以发现分组没有什么用,定义一个单个物品为权值为ai,数量为ai在模k意义下的能取到值的个数,即循环节长度。
接着这个多重背包就可以用二进制优化了。
80%:O(nk)
发现一个容量会被重复凑出很多次。
放在模k意义下,那么答案最多有k个。设dp[k]为k能否被凑出,然后搜索用n个物品反复拓展到新状态即可。
100%:O(n+k)
从给的样例中其实就能看出答案是个等差数列,yy一下能发现公差就是ai和k的gcd
然后就AC了。。。。。。
考场上我这都没看出来额。。。
正确性:
ax+by=c(mod k)有整数解当且仅当 d|c,
那么ax+by+cz+....=q(mod k)有整数解当且仅当gcd(a,b,c,...)|q
其实就是裴蜀定理的推论。
B. biology
考试的时候一直在想图论,然后最后就打了一个n^2m^2的拓扑跑了。。。
后来一想DAG拓扑不就是dp吗。。。
拓扑没办法优化可是dp可以
40%:O(n^2m^2)朴素dp:f[i][j]=max(f[k][l]+b[i][j]+|i-k|+|j-l|)
80%:O(nmlognlogm)
柿子套路,遇到绝对值要拆开
之后就可以用四个二维树状数组维护了。
100%:
切比雪夫距离
先鸽一下