poi2007--drz。

好开心,一次就ac了。。(其实。。这就是一道10k左右的线段树水题。。)

 


{ps:很囧。。。我想了差不多两小时都没想出来。最后看了一下题解- -|ca。。。波兰文的- -|显然我不是

语言帝我是看不懂的- -|中文题解又有bug- -然后看了一下那些式子- -差不多懂了- -|。。
好吧。。跟上次那道物理题一样。。既然是计算机竞赛题目- -就不要像我一样太往数学方面想,。一开始一直想如何贪心活着数学方法什么的。
}

 

 

看了题解后顿悟这题很水。。竟然没自己想出来,分析没有对路啊。。应该是我没有往那么多种情况考虑- -|

以后再遇到这个类型的题目- -有情况就拉进来分析。。然后大胆的分类讨论。。

 

这种题目就是找出他的表达式,然后进行化简并且分情况讨论。。
当这种求区间最值又有一定大小限制的就是先离散化,然后根据要求按顺序插入。。。
而且当时我一直在想简单的方法。。结果分9种情况。、、啊。。。拿来练手也是不错的- -
我们设vi=|hi+1-hi|+|hi-1 - hi|

然后对调一次i,j的代价就是  |hj+1-hi|+|hj-1 - hi|+|hi+1-hj|+|hi-1 - hj| -vi - vj


然后设

max[i]=max(h[i-1],h[i+1])

min[i]=min(h[i-1],h[i+1])

 

这个就变成了 |maxj-hi|+|minj - hi|+|maxi-hj|+|mini - hj| -vi - vj

 

这些是做这题做的草稿- -|好吧。。我太弱了。。。为了避免出错检查太久,我得一个一个列出来才会

- -然后列了差不多7个后才发现了点规律 。。

当然以上只适用于abs(i-j)>1的和(i,j <>1 or i,j<>n)

所以这些先朴素弄出来。


先拿这个情况分析一下
1.h[i]<min[ j]    h[j]<min[i]


   delta = min_i+max_i+min_j+max_j-2*h_i-2*h_j-v_i-v_j
key[j] = min_j + max_j - 2*h_j - v_j
add[i] = key[i]

我们把 min[i], h[i] ,max[i] 都离散化。从大到小排序。。然后维护一个h值的线段树

按照从大到小插。
遇到min_i 在插入h[i]的位置插入key[i]
遇到max_i 无视
遇到h_i 利用线段树找出 从初始到min_i的最小key值



算了 下划线太不顺手了。。还是用中括号来= =

2. min_j<h_i<max_j    h_j<min_i
delta = max[j]-min[j]+max[i]+min[i]-2*h[j]-v[i]-v[j]
key[j] = max_j - min_j - 2*h_j - v_j
add[i] = min_i + max_i - v_i
按从小到大插
遇到min_i 插入 key[i] 到 h_i
遇到max_i 删除 key[i]
遇到h_i 利用线段树找出 从初始到min_i的最小key值

3.h[i]>max[j]  h[j]<min[i]
   delta = 2*h[i]-max[j]-min[j]+max[i]+min[i]-2*h[j]-v[i]-v[j]
   key[j] = -max[j]-min[j]-2*h[j]-v[j]
   add[i] = 2*h[i]+min[i]+max[i]-v[i];
遇到max[i] 插入 h[i]
min无视
遇到hi利用线段树找出max[i]到终点的最小key值。。。


前三种情况是作为代表性的三种- -|

(1.4.7 )(2,5,8) (3,6,9)  每组内都是类似的。。 线段树。。同理。。

4.h[i]<min[j]   min[i]<h[j]<max[i]
  delta = min[j]+max[j]-2*h[i] + max[i]-min[i]-v[i]-v[j]
  key[j] = min[j] + max[j] -v[j];
  add[i] = -2*h[i]+max[i]-min[i] -v[i];

类似1

5,min[j]<h[i]<max[j]  min[i]<h[j]<max[i]
  delta = max[i]-min[i]+max[j]-min[j]-v[i]-v[j]
key[j] =max[j]-min[j]-v[j];
add[i] = key[i]
类似二。

6。h[i]>max[j]  min[i]<h[j]<max[i]

7 h[i]<min[j]   h[j]>max[i]
  delta = min[j] + max[j] -2 * h[i]  +2*h[j] - max[i] -min[i]-v[i]-v[j]
key[j] = 2*h[j] +max[j]+min[j] -v[j]
add[i] = -2*h[i]-max[i]-min[i] -v[i]

8 min[j]<h[i]<max[j]  h[j]>max[i]
deta = max[j]-min[j] +2*h[j]-max[i]-min[i] -v[i]-v[j]
key[j] = max[j]-min[j]+2*h[j]-v[j]
add[i] = -max[i]-min[i]-v[i]

9.h[i]>max[j]  h[j]>max[i]





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值