Submission #1220670

#TimeUsernameProblemLanguageResultExecution timeMemory
1220670moha1111Rice Hub (IOI11_ricehub)C++20
100 / 100
330 ms5516 KiB
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#include "ricehub.h"
#include <cstdio>
#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
#define all(a) a.begin() , a.end()
const long long mod = 1000000007;
using namespace std;
using namespace __gnu_pbds;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indexed_set;
typedef tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update>indexed_multiset;

bool valid (int n , int k , int a[] , long long t)
{
    multiset<int> l , r;
    long long sum1 = 0 , sum2 = 0;
    for(int i = 0 ; i < n ; i++)
    {
        if(i >= k)
        {
            if(l.find(a[i - k]) != l.end())
            {
                l.erase(l.find(a[i - k]));
                sum1 -= a[i - k];
            }
            else
            {
                r.erase(r.find(a[i - k]));
                sum2 -= a[i - k];
            }
        }
        if(l.size() <= r.size())
        {
            l.insert(a[i]);
            sum1 += a[i];
        }
        else
        {
            r.insert(a[i]);
            sum2 += a[i];
        }
        
        if(l.size() > 0 && r.size() > 0 && *l.rbegin() > *r.begin())
        {
            sum1 += (*r.begin() - *l.rbegin());
            sum2 += (*l.rbegin() - *r.begin());
            l.insert(*r.begin());
            r.insert(*l.rbegin());
            r.erase(r.begin());
            l.erase(l.find(*l.rbegin()));            
        }
        if(i >= k - 1 && (l.size() * *l.rbegin() - sum1) + (sum2 - *l.rbegin() * r.size()) <= t)
                return 1;
    }
    return 0;
}

int besthub(int r , int l , int a[] , long long b)
{
    long long st = 1 , en = r;
    int ans = 1;
    while(st <= en)
    {
        long long mid = (st + en) / 2;
        if(valid(r , mid , a , b))
            st = mid + 1 , ans = mid;

        else
            en = mid - 1;
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...