又一轮考试,总结如下:
第一题:想了一下,实在不会,就暴力枚举每个区间,结果。。。正确做法:把x 的所有出现位置和y 的所有出现位置拿出来,排序之后从前往后扫,做法与暴力类似,但是压缩了中间没有影响的位置。大大节省了时间,复杂度n平方。由于时间限制是2秒(这个我没看到)所以不会超时。主要是思路没有打开。
第二题:
一个dp可以搞定,但我还是没有写出来。思考的时候方向错误,虽然运行答案正确了一部分,但有许多超时。应该作差得到逆序数b[i]。首先可以根据最后一位的逆序数确定最后一个数,然后倒着依 次确定每个数。a[1..i]中,有bi 个数比a[i]大,则a[i]为剩下可选择的i个数中第i-b[i] 小。可以用二分+树状数组解决。
第三题:
真的一点思路都没有,题也没看懂。后来才知道要使用分治算法,因为可以离线做,假设当前在处理分治区间[L,R],设mid=(L+R)/2,处理询问区间跨过了mid 的询问, 可以用DP得到lef[i][x][y]表示从x 出发,处理了从i到mid 的边之后到达y 的最小代价, 以及rig[i][x][y]表示从x 出发,处理了从mid+1 到i 的边之后到达y 的最小代价,那么 查询的时候只要枚举一下中间经过的点就好了。
这次考试难,今后要掌握做题的技巧,时间的分配要合理。好了,就这么多。