제출 #1328030

#제출 시각아이디문제언어결과실행 시간메모리
1328030GabrielFeast (NOI19_feast)C++20
30 / 100
51 ms21420 KiB
#include "bits/stdc++.h"
using namespace std;
deque<long long> a, Jaja;
struct Valor{
    long long Izquierda, Derecha, Respuesta, Suma;
};
vector<Valor> _rbol;
Valor Neutro;
Valor operator+(const Valor& a, const Valor& b){
    Valor c;
    c.Izquierda = max(a.Izquierda, a.Suma + b.Izquierda);
    c.Derecha = max(b.Derecha, a.Derecha + b.Suma);
    c.Suma = b.Suma + a.Suma;
    c.Respuesta= max(max(a.Respuesta, b.Respuesta), a.Derecha + b.Izquierda);
    return c;
}
void Asignar(int p, long long v){
    _rbol[p].Izquierda = max(0LL, v);
    _rbol[p].Derecha = max(0LL, v);
     _rbol[p].Respuesta = max(0LL, v);
    _rbol[p].Suma = v;
}
void Crear(int i, int d, int p){
    if(i == d){
        Asignar(p, a[i]);
        Jaja[i] = p;
        return;
    }
    int P = (i + d) / 2;
    Crear(i, P, p * 2);
    Crear(P + 1, d, p * 2 + 1);
    _rbol[p] = _rbol[p * 2] + _rbol[p * 2 + 1];
}
void Actualizar(int p, int o, long long v){
    if(p == 0) return;
    if(p == o) Asignar(p, v);
    else _rbol[p] = _rbol[p * 2] + _rbol[p * 2 + 1];
    Actualizar(p / 2, o + 22, -2222);
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    Neutro.Suma = 0;
    Neutro.Izquierda = 0;
    Neutro.Derecha = 0;
    Neutro.Respuesta = 0;
    int n, k;
    cin>>n>>k;
    k--;
    long long r = 0;
    for(int i = 0; i < n; i++){
        long long v;
        cin>>v;
        if(v == 0) continue;
        if(a.empty()) a.push_back(v);
        else if((a.back() / abs(a.back())) == (v / abs(v))) a.back() += v;
        else a.push_back(v);
    }
    while(!a.empty() and a[0] < 0) a.pop_front();
    while(!a.empty() and a.back() < 0) a.pop_back();
    n = a.size();
    if(n == 0){
        cout<<0;
        return 0;
    }
    _rbol.assign(n * 4 + 22, Neutro);
    Jaja.assign(n, 0);
    Crear(0, n - 1, 1);
    set< pair<long long, int> > Mejores;
    long long Respuesta = _rbol[1].Respuesta;
    for(int i = 0; i < n; i++){
        if(a[i] < 0){
            Mejores.insert({-a[i], i});
            Actualizar(Jaja[i], Jaja[i], 0);
            if(Mejores.size() > k){
                auto E = *Mejores.begin();
                Actualizar(Jaja[E.second], Jaja[E.second], a[E.second]);
                Mejores.erase(E);
            }
        }
        Respuesta = max(Respuesta, _rbol[1].Respuesta);
    }
    cout<<Respuesta;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...