제출 #1349288

#제출 시각아이디문제언어결과실행 시간메모리
1349288ElayV13벽 (IOI14_wall)C++20
0 / 100
3095 ms10544 KiB
#include "wall.h"
#include "bits/stdc++.h"
using namespace std;

const int N=100001;

struct Fmx{
      int st[N*4];
      int lazy[N*4];
      void push(int idx,int l,int r){
            st[idx]=max(st[idx],lazy[idx]);
            if(l!=r){
                  lazy[idx*2]=max(lazy[idx*2],lazy[idx]);
                  lazy[idx*2+1]=max(lazy[idx*2+1],lazy[idx]);
            }
            lazy[idx]=0;
      }

      void upd(int idx,int l,int r,int ql,int qr,int val){
            push(idx,l,r);
            if(ql>r||l>qr) return;
            else if(ql<=l&&r<=qr){
                  lazy[idx]=max(lazy[idx],val);
                  push(idx,l,r);
                  return;
            }
            int mid=(l+r)>>1;
            upd(2*idx,l,mid,ql,qr,val);
            upd(2*idx+1,mid+1,r,ql,qr,val);
            st[idx]=max(st[idx*2],st[idx*2+1]);
      }

      int ask(int idx,int l,int r,int ql,int qr){
            push(idx,l,r);
            if(ql>r||l>qr) return 0;
            else if(ql<=l&&r<=qr) return st[idx];
            int mid=(l+r)>>1;
            return max(ask(2*idx,l,mid,ql,qr),ask(2*idx+1,mid+1,r,ql,qr));
      }
};
Fmx fmx;

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) fmx.upd(1,1,n,left[i]+1,right[i]+1,height[i]);
      }
      for(int i=0;i<n;i++) finalHeight[i]=fmx.ask(1,1,n,i+1,i+1);
      for(int i=0;i<k;i++){
            if(op[i]==2){
                  for(int j=left[i];j<=right[i];j++) finalHeight[j]=min(finalHeight[j],height[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...