제출 #413389

#제출 시각아이디문제언어결과실행 시간메모리
413389pliam벽 (IOI14_wall)C++14
100 / 100
1293 ms85264 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXN 2000005
#define INF (int)1e9+5

int st[4*MAXN],lazy_lower[4*MAXN],lazy_upper[4*MAXN];//minimum segment tree
int final[MAXN];
int N;

void update(int from,int to,int low,int up,int v=1,int start=0,int end=N-1){
  if(start==from&&end==to){
    st[v]=max(st[v],low);
    st[v]=min(st[v],up);
    if(low>lazy_upper[v]){
      lazy_upper[v]=lazy_lower[v]=low;
    }else if(up<lazy_lower[v]){
      lazy_lower[v]=lazy_upper[v]=up;
    }else{
      lazy_lower[v]=max(lazy_lower[v],low);
      lazy_upper[v]=min(lazy_upper[v],up);
    }
    return;
  }
  int mid=(start+end)/2;
  //propagate
  update(start,mid,lazy_lower[v],lazy_upper[v],2*v,start,mid);
  update(mid+1,end,lazy_lower[v],lazy_upper[v],2*v+1,mid+1,end);
  lazy_lower[v]=0;
  lazy_upper[v]=INF;

  if(to<=mid){
    update(from,to,low,up,2*v,start,mid);
  }else if(from>mid){
    update(from,to,low,up,2*v+1,mid+1,end);
  }else{
    update(from,mid,low,up,2*v,start,mid);
    update(mid+1,to,low,up,2*v+1,mid+1,end);
  }
  st[v]=min(st[2*v],st[2*v+1]);
}

void build(int v=1,int start=0,int end=N-1){
  if(start==end){
    lazy_upper[v]=INF;
    return;
  }
  int mid=(start+end)/2;
  build(2*v,start,mid);
  build(2*v+1,mid+1,end);
  lazy_upper[v]=INF;
}

void build_result(int v=1,int start=0,int end=N-1){
  if(start==end){
    final[start]=st[v];
    return;
  }
  int mid=(start+end)/2;
  //propagate
  update(start,mid,lazy_lower[v],lazy_upper[v],2*v,start,mid);
  update(mid+1,end,lazy_lower[v],lazy_upper[v],2*v+1,mid+1,end);
  lazy_lower[v]=0;
  lazy_upper[v]=INF;

  build_result(2*v,start,mid);
  build_result(2*v+1,mid+1,end);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  N=n;
  build();
  for(int i=0;i<k;i++){
    if(op[i]==1){
      update(left[i],right[i],height[i],INF);
    }else{
      update(left[i],right[i],0,height[i]);
    }
  }
  build_result();
  for(int i=0;i<n;i++){
    finalHeight[i]=final[i];
  }
  return;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...