POJ3276(遍历+区间修改)

http://poj.org/problem?id=3276

题意:n(n<=5000)头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方。

问:求最小操作m,再此基础上求k。

首先不要看错题意,这不是一个求最小k的,而是求m最小时,k为多少,所以不能够使用二分进行解题,再看数据有5000头牛,则算法复杂度至多为 n^2 ,而首先k的遍历是必须的,这就已经是n了,那么就需要在遍历过程中的每个k求最小操作数时最多为n,也就是最多只能遍历一次就要求出相应k的最小操作数,由于是区间修改,所以可以借鉴之前的一道树状数组区间修改的题目,用一个sum表示所有包含当前位的区间的反转次数(在遍历过程不断更新),所以只需要在遍历过程在末尾加上前一位操作的反转次数,如果首元素已经波及不到当前元素则减去,最后对剩余牛进行遍历检验是否符合要求即可

(这个思路和上一篇博客那个牛踩踏板的思路相仿,

上一篇是对之前行的每个格子进行查询,如果不合格,通过改变当前行来改变之前行,最后查询最后一行是否合格即可

(也就是枚举第一行,然后只考虑下一行对之前行的影响,最后看最后一行是否满足要求)

这一篇则是对当前位的格子进行查询,如果不合格,改变当前格子,最后查询那些不能自行反转的格子即可

(也就是只考虑之前格子对当前格子的影响,不考虑后来格子对该格子的影响,然后一点点遍历下去,最后检查最后几个格子即可)

 

posted @ 2018-03-14 09:14  MekakuCityActor  阅读(139)  评论(0编辑  收藏  举报