HDU 3207 Highway

题目大意:

不超过10 ^ 5个数, 一开始设定为相同的正整数, 模拟3种操作:

a) 询问一段区间是否连续, 是的话把这一段数减去某个数, 当某个数小于等于0时相当于断开.

b) 把一段区间的数增加一个数, 断开的数不再增加.

c) 把一段区间的数与某个数取max , 断开的数不参与此过程.

 

简要分析:

数据结构题, 分块要好写一些. 假定每个数减到小于0时修改为0. 每一块多维护4个值: 最小值minv, 变化量delta, c操作的标记addto, 还要记录一个offset, 它的含义是指某一块在其他标记存在的情况下, 不超过-offset的块中的数已经断开. 另外注意到b和c两种标记可以这样处理, 在b操作时把c操作的表示也加上那个增加量, 那么当更新一个块时就可以先加上delta再与addto取max. 那么每个操作对一个块标记修改的部分可以这样实现:

a) 设减去的数为d, 则minv = max(0, minv - d), addto = max(0, addto - d), delta -= d, 如果addto为0了再修改offset, offset = min(offset, delta);

b) 设加上的数为d, 则delta += d, 若minv大于0则minv += d, 若addto大于0则addto += d;

c) 设与d取max, 若d大于minv且d大于addto时才有考虑它的必要, addto = d, 若minv大于0则minv=d.

复杂度O(m * sqrt(n)), m为操作次数.

 

代码实现:

View Code
posted @ 2012-02-25 01:24  zcwwzdjn  阅读(302)  评论(0编辑  收藏  举报