Submission #1340898

#TimeUsernameProblemLanguageResultExecution timeMemory
1340898NipphitchFeast (NOI19_feast)C++20
0 / 100
1087 ms115132 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define a3 array <int,3> 
const int N=3e5+5;

int n,m,a[N],ans;
set <a3> pos1,pos2,neg;
priority_queue <a3,vector <a3>,greater <a3>> pq;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for(int i=1;i<=n;i++) cin >> a[i];
    for(int i=1;i<=n;i++){
        int sum=a[i],l=i;
        while(i+1<=n && a[i]>=0 && a[i+1]>=0) sum+=a[++i];
        while(i+1<=n && a[i]<0 && a[i+1]<0) sum+=a[++i];
        int r=i;
        if(sum>=0){
            pos1.insert({sum,l,r});
            pos2.insert({l,r,sum});
        }
        else neg.insert({l,r,sum});
    }
    for(;pos1.size()>m;){
        auto [sum,l,r]=*pos1.begin();
        auto itr=neg.lower_bound({l,r,sum});
        int mn=1e9+7;
        cout << pos1.size() << " ";
        if(itr!=neg.end()){
            mn=min(mn,(*itr)[2]);
        }
        if(itr!=neg.begin()){
            auto itl=prev(itr);
            mn=min(mn,(*itl)[2]);
        }
        if(mn!=1e9+7 && mn==(*itr)[2] && sum>-mn){
            auto pos_it=pos2.upper_bound({l,r,sum});
            if(pos_it!=pos2.end()){
                auto [l2,r2,sum2]=*pos_it;
                int new_sum=sum+(*itr)[2]+(*pos_it)[2];
                
                if(itr==neg.end()){
                    cout << "ITR 0" << "\n";
                    break;
                }
                neg.erase(itr);

                if(pos1.find({sum,l,r})==pos1.end()){
                    cout << "ITR 1" << "\n";
                    break;
                }
                pos1.erase(pos1.find({sum,l,r}));

                if(pos1.find({sum2,l2,r2})==pos1.end()){
                    cout << "ITR 2" << "\n";
                    break;
                }
                pos1.erase(pos1.find({sum2,l2,r2}));

                if(pos2.find({l,r,sum})==pos2.end()){
                    cout << "ITR 3" << "\n";
                    break;
                }
                pos2.erase(pos2.find({l,r,sum}));

                if(pos2.find({l2,r2,sum2})==pos2.end()){
                    cout << "ITR 4" << "\n";
                    break;
                }
                pos2.erase(pos2.find({l2,r2,sum2}));

                pos1.insert({new_sum,l,r2});
                pos2.insert({l,r2,new_sum});
            }
        }
        else if(mn!=1e9+7 && sum>-mn){
            if(pos2.upper_bound({l,r,sum})!=pos2.begin()){
                auto itl=prev(itr);
                auto pos_it=prev(pos2.upper_bound({l,r,sum}));
                auto [l2,r2,sum2]=*pos_it;
                int new_sum=sum+(*itl)[2]+(*pos_it)[2];

                if(itl==neg.end()){
                    cout << "ITL 0" << "\n";
                    break;
                }
                neg.erase(itl);

                if(pos1.find({sum,l,r})==pos1.end()){
                    cout << "ITL 1" << "\n";
                    break;
                }
                pos1.erase(pos1.find({sum,l,r}));

                if(pos1.find({sum2,l2,r2})==pos1.end()){
                    cout << "ITL 2" << "\n";
                    break;
                }
                pos1.erase(pos1.find({sum2,l2,r2}));

                if(pos2.find({l,r,sum})==pos2.end()){
                    cout << "ITL 3" << "\n";
                    break;
                }
                pos2.erase(pos2.find({l,r,sum}));

                if(pos2.find({l2,r2,sum2})==pos2.end()){
                    cout << "ITL 4" << "\n";
                    break;
                }
                pos2.erase(pos2.find({l2,r2,sum2}));

                pos1.insert({new_sum,l,r2});
                pos2.insert({l,r2,new_sum});
            }
        }
        else{
            if(pos1.find({sum,l,r})==pos1.end()){
                cout << "ELSE 1" << "\n";
                break;
            }
            pos1.erase(pos1.find({sum,l,r}));

            if(pos2.find({l,r,sum})==pos2.end()){
                cout << "ELSE 1" << "\n";
                break;
            }
            pos2.erase(pos2.find({l,r,sum}));
        }
        cout << "XD \n";
    }
    //for(auto [sum,l,r]:pos1) ans+=sum;
    //cout << ans;
    for(auto [sum,l,r]:pos1) cout << l << " , " << r << "  =  " << sum << "\n";
}
#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...