이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define mp make_pair
#include "wall.h"
pair<int,int> lz[8000005],seg[8000005];
int ans[2000005];
pair<int,int> merge(pair<int,int> lz1,pair<int,int> lz2)
{
if(lz2.X>lz1.Y)return mp(lz2.X,lz2.X);
if(lz2.Y<lz1.X)return mp(lz2.Y,lz2.Y);
return mp(max(lz1.X,lz2.X),min(lz1.Y,lz2.Y));
}
void update(int tree,int st,int ed,int l,int r,int x,int y)
{
int md=(st+ed)/2;
if(st>=l&&ed<=r)
{
lz[tree]=merge(lz[tree],mp(x,y));
}
if(st!=ed)
{
lz[2*tree]=merge(lz[2*tree],lz[tree]);
lz[2*tree+1]=merge(lz[2*tree+1],lz[tree]);
}
seg[tree]=merge(seg[tree],lz[tree]);
lz[tree].X=0,lz[tree].Y=1e9;
if(st>r||ed<l)return;
if(st>=l&&ed<=r)return;
update(2*tree,st,md,l,r,x,y);
update(2*tree+1,md+1,ed,l,r,x,y);
}
void dfs(int tree,int st,int ed)
{
int md=(st+ed)/2;
if(st!=ed)
{
lz[2*tree]=merge(lz[2*tree],lz[tree]);
lz[2*tree+1]=merge(lz[2*tree+1],lz[tree]);
}
seg[tree]=merge(seg[tree],lz[tree]);
lz[tree].X=0,lz[tree].Y=1e9;
if(st==ed)
{
ans[st]=seg[tree].X;
return;
}
dfs(2*tree,st,md);
dfs(2*tree+1,md+1,ed);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
for(int i=0;i<=2000000;i++)lz[i].X=0,lz[i].Y=1e9,seg[i].X=0,seg[i].Y=0;
for(int i=0;i<k;i++)
{
left[i]+=1,right[i]+=1;
if(op[i]==1)
{
update(1,1,n,left[i],right[i],height[i],1e9);
}else
{
update(1,1,n,left[i],right[i],0,height[i]);
}
}
dfs(1,1,n);
for(int i=0;i<n;i++)finalHeight[i]=ans[i+1];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |