Submission #292307

#TimeUsernameProblemLanguageResultExecution timeMemory
292307kimbj0709모임들 (IOI18_meetings)C++14
17 / 100
362 ms12288 KiB
#include "meetings.h"
#include<bits/stdc++.h>
using namespace std;
#define maxn 100050
vector<int> sum(maxn*4,0);
vector<int> prefix(maxn*4,0);
vector<int> suffix(maxn*4,0);
vector<int> maximum(maxn*4,0);
vector<int> vect1;
void build(int node,int start,int end){
  if(start==end){
    if(vect1[start]==1){
      prefix[node] = suffix[node] = sum[node] = 1;
    }
    else{
        sum[node] = 1;
    }
    return;
  }
  int mid = (start+end)/2;
  build(node*2+1,start,mid);
  build(node*2+2,mid+1,end);
  if(prefix[node*2+1]==sum[node*2+1]){
    prefix[node] = prefix[node*2+1]+prefix[node*2+2];
  }
  else{
    prefix[node] = prefix[node*2+1];
  }
  if(suffix[node*2+2]==sum[node*2+2]){
    suffix[node] = suffix[node*2+2]+suffix[node*2+1];
  }
  else{
    suffix[node] = suffix[node*2+2];
  }
  sum[node] = sum[node*2+2]+sum[node*2+1];
  maximum[node] = max(prefix[node*2+2]+suffix[node*2+1],max(maximum[node*2+1],maximum[node*2+2]));
}
int an = 0;
vector<int> query(int node,int start,int end,int rangemin,int rangemax){
  //cout << start << " " << end << endl;
  if(start>rangemax||end<rangemin){
    return {0,0,0};
  }
  if(start>=rangemin&&end<=rangemax){
    an = max(an,maximum[node]);
    return {prefix[node],suffix[node],sum[node]};
  }
  int mid = (start+end)/2;
  vector<int> a = query(node*2+1,start,mid,rangemin,rangemax);
  vector<int> b = query(node*2+2,mid+1,end,rangemin,rangemax);
  if(a[0]==-1){
    return b;
  }
  if(b[0]==-1){
    return a;
  }
  an = max(an,a[1]+b[0]);
  vector<int> ret(3);
  ret[2] = a[2]+b[2];
  if(a[0]==a[2]){
    ret[0] = a[0]+b[0];
  }
  else{
    ret[0] = a[0];
  }
  if(b[1]==b[2]){
    ret[1] = b[1]+a[1];
  }
  else{
    ret[1] = b[1];
  }
  //cout << start << " " << end << " " << ret[0] << " " << ret[1] << " " << ret[2] << "\n";
  return ret;
}

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L,
                                     std::vector<int> R) {
  vector<long long int> ans(L.size());
  vect1 = H;
  build(0,0,vect1.size()-1);
  for(int i=0;i<L.size();i++){
    query(0,0,vect1.size()-1,L[i],R[i]);
    //cout << an << "\n";
    ans[i] = (R[i]-L[i]+1)*2-an;
    an = 0;
  }
  return ans;
}

Compilation message (stderr)

meetings.cpp: In function 'std::vector<long long int> minimum_costs(std::vector<int>, std::vector<int>, std::vector<int>)':
meetings.cpp:81:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |   for(int i=0;i<L.size();i++){
      |               ~^~~~~~~~~
#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...