Submission #75486

#TimeUsernameProblemLanguageResultExecution timeMemory
75486C_SUNSHINEMeetings (IOI18_meetings)C++14
19 / 100
5587 ms4868 KiB
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
#include "meetings.h"
using namespace std;

typedef long long LL;

LL vl[750005],vr[750005];

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R)
{
  vector<LL> C;
  int Q=L.size();
  for(int qi=0;qi<Q;qi++)
  {
    int l=L[qi],r=R[qi];
    vector<int> st;
    st.clear();
    LL now=0;
    for(int i=l;i<=r;i++)
    {
      while(!st.empty()&&H[i]>H[st.back()])
      {
        if(st.size()==1)now-=((LL)st[0]-l+1)*H[st[0]];
        else now-=((LL)st[st.size()-1]-st[st.size()-2])*H[st.back()];
        st.pop_back();
      }
      if(st.size()==0)now+=((LL)i-l+1)*H[i];
      else now+=((LL)i-st.back())*H[i];
      st.push_back(i);
      vl[i]=now;
    }
    st.clear();
    now=0;
    for(int i=r;i>=l;i--)
    {
      while(!st.empty()&&H[i]>H[st.back()])
      {
        if(st.size()==1)now-=((LL)r-st[0]+1)*H[st[0]];
        else now-=((LL)st[st.size()-2]-st[st.size()-1])*H[st.back()];
        st.pop_back();
      }
      if(st.size()==0)now+=((LL)r-i+1)*H[i];
      else now+=((LL)st.back()-i)*H[i];
      st.push_back(i);
      vr[i]=now;
    }
    LL ans=1LL<<60;
    for(int i=l;i<=r;i++)
    {
      ans=min(ans,vl[i]+vr[i]-H[i]);
      //cout<<i<<' '<<vl[i]<<' '<<vr[i]<<endl;
    }
    C.push_back(ans);
  }
  return C;
}
#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...