Loading

代码-洛谷P1484 种树

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,a,b) for(int i(a),i##E(b);i<i##E;i++)
#define L(i,a,b) for(int i((b)-1),i##E((a)-1);i>i##E;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=5e5;
int n,k; ll a[N];
pair<int,int> e[N];
void del(int i){
    if(!~i) return; 
    if(~e[i].x) e[e[i].x].y=e[i].y;
    if(~e[i].y) e[e[i].y].x=e[i].x;
    e[i]=mp(-2,-2);
}
priority_queue<pair<ll,int>> q;

//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>k;
    R(i,0,n) cin>>a[i],e[i]=mp(i-1,i+1),
        q.push(mp(a[i],i));
    ll ns=0;
    while(sz(q)&&k){
        int i=q.top().y; q.pop();
        if(e[i].x==-2) continue;
        if(a[i]<=0) break;
        k--,ns+=a[i],a[i]=-a[i];
        if(~e[i].x) a[i]+=a[e[i].x];
        if(~e[i].y) a[i]+=a[e[i].y];
        del(e[i].x),del(e[i].y);
        q.push(mp(a[i],i));
    }
    cout<<ns<<'\n';
    return 0;
}
posted @ 2020-11-12 17:53  George1123  阅读(56)  评论(0)    收藏  举报