Submission #990087

#TimeUsernameProblemLanguageResultExecution timeMemory
990087huutuanWall (IOI14_wall)C++14
100 / 100
377 ms99568 KiB
#include "wall.h"

#include <bits/stdc++.h>

using namespace std;

const int inf=1e9;

struct SegmentTree{
   int n;
   vector<pair<int, int>> t;
   void init(int _n){
      n=_n;
      t.assign(4*n+1, {-inf, inf});
   }
   void build(int k, int l, int r){
      if (l==r){
         t[k]={0, 0};
         return;
      }
      int mid=(l+r)>>1;
      build(k<<1, l, mid);
      build(k<<1|1, mid+1, r);
   }
   void apply(int k, pair<int, int> val){
      if (t[k].second<val.first) t[k]={val.first, val.first};
      else if (t[k].first>val.second) t[k]={val.second, val.second};
      else t[k]={max(t[k].first, val.first), min(t[k].second, val.second)};
   }
   void push(int k){
      if (t[k]!=pair<int, int>{-inf, inf}){
         apply(k<<1, t[k]);
         apply(k<<1|1, t[k]);
         t[k]={-inf, inf};
      }
   }
   void update(int k, int l, int r, int L, int R, pair<int, int> val){
      if (r<L || R<l) return;
      if (L<=l && r<=R){
         apply(k, val);
         return;
      }
      push(k);
      int mid=(l+r)>>1;
      update(k<<1, l, mid, L, R, val);
      update(k<<1|1, mid+1, r, L, R, val);
   }
   void get_all(int k, int l, int r, int ans[]){
      if (l==r){
         ans[l]=t[k].first;
         return;
      }
      push(k);
      int mid=(l+r)>>1;
      get_all(k<<1, l, mid, ans);
      get_all(k<<1|1, mid+1, r, ans);
   }
} st;

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
   st.init(n);
   st.build(1, 0, n-1);
   for (int i=0; i<k; ++i){
      int l=left[i], r=right[i], h=height[i];
      int lg=__lg(r-l+1);
      if (op[i]==1){
         st.update(1, 0, n-1, l, r, {h, inf});
      }else{
         st.update(1, 0, n-1, l, r, {-inf, h});
      }
   }
   st.get_all(1, 0, n-1, finalHeight);
   return;
}

Compilation message (stderr)

wall.cpp: In function 'void buildWall(int, int, int*, int*, int*, int*, int*)':
wall.cpp:65:11: warning: unused variable 'lg' [-Wunused-variable]
   65 |       int lg=__lg(r-l+1);
      |           ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...