bzoj1150

haha,贪心,边界条件折腾了我一会儿
1 #include<cstdio> 2 #include<cctype> 3 #include<queue> 4 #include<algorithm> 5 using namespace std ; 6 7 const int MAXN = 1000000 + 200 ; 8 int N , K ; 9 int dis [ MAXN ] ; 10 int l [ MAXN ] ; 11 int r [ MAXN ] ; 12 int v [ MAXN ] ; 13 int vis [ MAXN ] ; 14 int ans ; 15 struct cmp { 16 bool operator () ( const int a , const int b ) { return v [ a ] > v [ b ] ; } ; 17 } ; 18 priority_queue < int , vector < int > , cmp > q ; 19 20 int main () { 21 scanf ( "%d%d" , & N , & K ) ; 22 for ( int i = 1 ; i <= N ; ++ i ) scanf ( "%d" , dis + i ) ; 23 for ( int i = 1 ; i < N ; ++ i ) v [ i ] = dis [ i + 1 ] - dis [ i ] ; 24 for ( int i = 1 ; i < N - 1 ; ++ i ) r [ i ] = i + 1 ; 25 for ( int i = 2 ; i < N ; ++ i ) l [ i ] = i - 1 ; 26 for ( int i = 1 ; i < N ; ++ i ) q . push ( i ) ; 27 fill_n ( vis + 1 , N , 1 ) ; 28 v [ 0 ] = 1000000000 + 1 ; 29 v [ N ] = 1000000000 + 1; 30 while ( K -- ) { 31 while ( ! vis [ q . top () ] ) q . pop () ; 32 const int o = q . top () ; q . pop () ; 33 ans += v [ o ] ; 34 vis [ l [ o ] ] = 0 ; 35 vis [ r [ o ] ] = 0 ; 36 v [ o ] = v [ l [ o ] ] + v [ r [ o ] ] - v [ o ] ; 37 q . push ( o ) ; 38 l [ o ] = l [ l [ o ] ] ; r [ o ] = r [ r [ o ] ] ; 39 r [ l [ o ] ] = l [ r [ o ] ] = o ; 40 } 41 printf ( "%d\n" , ans ) ; 42 }

 

转载于:https://www.cnblogs.com/Christopher-Cao/p/5114961.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值