제출 #1333535

#제출 시각아이디문제언어결과실행 시간메모리
1333535Faisal_SaqibMeetings (IOI18_meetings)C++20
36 / 100
5590 ms35220 KiB
#include "meetings.h"
using namespace std;
typedef long long ll;
struct Data
{
  int pre,suf,mx,len;
};
const int LG=20,N=1e5+10;
Data sp[N][LG];
Data merge(Data a,Data b)
{
  Data ans;
  ans.mx=max(a.mx,b.mx);
  ans.pre=a.pre+b.pre*(a.pre==a.len);
  ans.suf=a.suf*(b.suf==b.len)+b.suf;
  ans.mx=max(ans.mx,a.suf+b.pre);
  ans.len=a.len+b.len;
  return ans;
}
int get(int ql,int qr)
{
  qr++;
  Data cur={0,0,0,0};
  for(int j=LG-1;j>=0;j--)
  {
    if((ql+(1<<j))<=qr)
    {
      cur=merge(cur,sp[ql][j]);
      ql+=(1<<j);
    }
  }
  return cur.mx;
}
std::vector<long long> minimum_costs(std::vector<int> h, std::vector<int> l,
                                     std::vector<int> r) {
  int n=h.size(),q=l.size(),mx=2;
  for(int i=0;i<n;i++)
  {
    mx=max(mx,h[i]);
  }
  if(mx==2)
  {
    for(int i=0;i<n;i++)
    {
      if(h[i]==2)
      {
        sp[i][0]={0,0,0,1};
      }
      else if (h[i]==1)
      {
        sp[i][0]={1,1,1,1};
      }
    }
    for(int j=1;j<LG;j++)
    {
      for(int i=0;i+(1<<j)<=n;i++)
        sp[i][j]=merge(sp[i][j-1],sp[i+(1<<(j-1))][j-1]);
    }
    vector<ll> fpp;
    for(int i=0;i<q;i++)
    {
      fpp.push_back(2*(r[i]-l[i]+1)-get(l[i],r[i]));
    }
    return fpp;
    // we want the maximum segment of ones in range l,r
  }

  vector<ll> fnl(q);
  vector<ll> cst(n+2,0);
  for(int i=0;i<q;i++)
  {
    int ql=l[i],qr=r[i];
    vector<int> c;
    ll ans=0;
    for(int x=ql;x<=qr;x++)    
    {
      while(c.size()>0 and h[c.back()]<=h[x])
      {
        int z=c.back();
        c.pop_back();
        ans-=1ll*(z-((c.size()>0)?(c.back()):(ql-1)))*h[z];
      }
      int z=x;
      ans+=1ll*(z-((c.size()>0)?(c.back()):(ql-1)))*h[z];
      c.push_back(x);
      cst[x]=ans;
    }
    ans=0;
    ll mi=1e18;
    c.clear();
    for(int x=qr;x>=ql;x--)
    {
      while(c.size()>0 and h[c.back()]<=h[x])
      {
        int z=c.back();
        c.pop_back();
        ans-=1ll*(((c.size()>0)?(c.back()):(qr+1))-z)*h[z];
      }
      int z=x;
      ans+=1ll*(((c.size()>0)?(c.back()):(qr+1))-z)*h[z];
      c.push_back(x);
      mi=min(mi,cst[x]+ans-h[x]);
    }
    fnl[i]=mi;
  }
  return fnl;
}
#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...