제출 #878196

#제출 시각아이디문제언어결과실행 시간메모리
878196JakobZorz벽 (IOI14_wall)C++17
100 / 100
561 ms72528 KiB
#include"wall.h"
#include<iostream>
using namespace std;

const int TREE_SIZE=1<<21;

#define upper first
#define lower second

pair<int,int>tree[2*TREE_SIZE];
bool lazy[2*TREE_SIZE];
void update(int node){
    if(node>=TREE_SIZE)
        return;
    
    if(lazy[node]){
        tree[2*node].upper=min(tree[2*node].upper,tree[node].upper);
        tree[2*node].upper=max(tree[2*node].upper,tree[node].lower);
        tree[2*node].lower=min(tree[2*node].lower,tree[node].upper);
        tree[2*node].lower=max(tree[2*node].lower,tree[node].lower);
        
        tree[2*node+1].upper=min(tree[2*node+1].upper,tree[node].upper);
        tree[2*node+1].upper=max(tree[2*node+1].upper,tree[node].lower);
        tree[2*node+1].lower=min(tree[2*node+1].lower,tree[node].upper);
        tree[2*node+1].lower=max(tree[2*node+1].lower,tree[node].lower);
        
        lazy[2*node]=true;
        lazy[2*node+1]=true;
        lazy[node]=false;
    }
}

void lh_bound(int node,int l,int r,int rl,int rr,pair<int,int>bound){
    update(node);
    
    if(r<=rl||rr<=l)
        return;
    
    if(l<=rl&&rr<=r){
        tree[node].lower=max(tree[node].lower,bound.lower);
        tree[node].lower=min(tree[node].lower,bound.upper);
        tree[node].upper=max(tree[node].upper,bound.lower);
        tree[node].upper=min(tree[node].upper,bound.upper);
        
        lazy[node]=true;
        return;
    }
    
    int mid=(rl+rr)/2;
    lh_bound(2*node,l,r,rl,mid,bound);
    lh_bound(2*node+1,l,r,mid,rr,bound);
    
    tree[node].lower=min(tree[2*node].lower,tree[2*node+1].lower);
    tree[node].upper=max(tree[2*node].upper,tree[2*node+1].upper);
}

void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]){
    for(int i=0;i<k;i++){
        if(op[i]==1){
            // adding phase
            pair<int,int>bound;
            bound.lower=height[i];
            bound.upper=1000000000;
            lh_bound(1,left[i],right[i]+1,0,TREE_SIZE,bound);
        }else{
            // removing phase
            pair<int,int>bound;
            bound.lower=-1000000000;
            bound.upper=height[i];
            lh_bound(1,left[i],right[i]+1,0,TREE_SIZE,bound);
        }
    }
    
    for(int i=1;i<2*TREE_SIZE;i++)
        update(i);
    
    for(int i=0;i<n;i++)
        finalHeight[i]=tree[TREE_SIZE+i].lower;
}

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