이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "wall.h"
#include<bits/stdc++.h>
using namespace std;
int yci[4000003],yci2[4000002], mini[4000002],maxi[4000000], lazymin[4000000],lazymax[4000000],fin[2000002],tree[4000000];
bool ispmin[4000003], ispmax[4000003];
void add(int le,int ri,int l,int r,int h, int ind)
{
if(mini[ind]>=lazymin[ind] && ispmin[ind])
{
mini[ind]=lazymin[ind];
maxi[ind]=mini[ind];
// tree[ind]=mini[ind];
if(le!=ri)
{
lazymin[2*ind]=min(lazymin[2*ind],lazymin[ind]);
lazymin[2*ind+1]=min(lazymin[2*ind+1],lazymin[ind]);
ispmin[2*ind]=ispmin[2*ind+1]=1;
}
lazymin[ind]=100000000;
if(mini[ind]==maxi[ind])tree[ind]=mini[ind];
}
if(l<=yci[le] && yci[ri]<=r)
{
if(maxi[ind]<=h){lazymax[ind]=max(lazymax[ind],h);ispmax[ind]=1;}
}
if(ispmax[ind] && maxi[ind]<=lazymax[ind])
{
maxi[ind]=lazymax[ind];
mini[ind]=maxi[ind];
//tree[ind]=maxi[ind];
if(le!=ri)
{
lazymax[2*ind]=max(lazymax[2*ind],lazymax[ind]);
lazymax[2*ind+1]=max(lazymax[2*ind+1],lazymax[ind]);
ispmax[2*ind]=ispmax[2*ind+1]=1;
}
lazymax[ind]=0;
if(mini[ind]==maxi[ind]){tree[ind]=mini[ind];}
}
//if(l<=yci[le] && yci[ri]<=r)return;
if(le==ri)return;
if(l>yci[ri] || r<yci[le])return;
int mid=(le+ri)/2;
add(le,mid,l,r,h,2*ind);
add(mid+1,ri,l,r,h,2*ind+1);
mini[ind]=min(mini[2*ind],mini[2*ind+1]);
maxi[ind]=max(maxi[2*ind],maxi[2*ind+1]);
if(mini[ind]==maxi[ind])tree[ind]=mini[ind];
}
void rem(int le,int ri,int l,int r,int h, int ind)
{
if(ispmax[ind] && maxi[ind]<=lazymax[ind])
{
maxi[ind]=lazymax[ind];
mini[ind]=maxi[ind];
//tree[ind]=maxi[ind];
if(le!=ri)
{
lazymax[2*ind]=max(lazymax[2*ind],lazymax[ind]);
lazymax[2*ind+1]=max(lazymax[2*ind+1],lazymax[ind]);
ispmax[2*ind]=ispmax[2*ind+1]=1;
}
lazymax[ind]=0;
if(mini[ind]==maxi[ind]){tree[ind]=mini[ind];}
}
if(l<=yci[le] && yci[ri]<=r)
{
if(mini[ind]>=h)
{
if(ispmin[ind])
lazymin[ind]=min(lazymin[ind],h);
else lazymin[ind]=h;ispmin[ind]=1;
}
}
if(mini[ind]>=lazymin[ind] && ispmin[ind])
{
mini[ind]=lazymin[ind];
maxi[ind]=mini[ind];
// tree[ind]=mini[ind];
if(le!=ri)
{
lazymin[2*ind]=min(lazymin[2*ind],lazymin[ind]);
lazymin[2*ind+1]=min(lazymin[2*ind+1],lazymin[ind]);
ispmin[2*ind]=ispmin[2*ind+1]=1;
}
lazymin[ind]=100000000;
if(mini[ind]==maxi[ind])tree[ind]=mini[ind];
}
//if(l<=yci[le] && yci[ri]<=r)return;
if(le==ri)return;
if(l>yci[ri] || r<yci[le])return;
int mid=(le+ri)/2;
rem(le,mid,l,r,h,2*ind);
rem(mid+1,ri,l,r,h,2*ind+1);
mini[ind]=min(mini[2*ind],mini[2*ind+1]);
maxi[ind]=max(maxi[2*ind],maxi[2*ind+1]);
if(mini[ind]==maxi[ind])tree[ind]=mini[ind];
}
void query(int le,int ri,int ind)
{
if(tree[ind]!=0){
//cout<<yci[le]<<" "<<yci[ri]<<" "<<maxi[ind]<<" "<<mini[ind]<<" "<<tree[ind]<<endl;
for(int i=yci[le];i<=yci[ri];i++)fin[i-1]=tree[ind];
if(maxi[ind]==mini[ind])return;
}
if(le==ri)return;
int mid=(le+ri)/2;
query(le,mid,2*ind);
query(mid+1,ri,2*ind+1);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
long long i,le=1;
for(i=0;i<k;i++)
{
left[i]++; right[i]++;
yci2[2*i]=left[i];
yci2[2*i+1]=right[i];
}
sort(yci2,yci2+2*k);
for(i=0;i<2*k;i++)
{
if(i!=0 && i<2*n && yci2[i]==yci2[i-1])continue;
yci[le++]=yci2[i];
}
for(i=0;i<4000000;i++)lazymin[i]=100000000;
for(i=0;i<k;i++)
{
if(op[i]==1)add(1,le-1,left[i],right[i],height[i],1);
else rem(1,le-1,left[i],right[i],height[i],1);
}
query(1,le-1,1);
for(i=0;i<n;i++)finalHeight[i]=fin[i];
return;
}
컴파일 시 표준 에러 (stderr) 메시지
wall.cpp: In function 'void rem(int, int, int, int, int, int)':
wall.cpp:83:13: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
83 | else lazymin[ind]=h;ispmin[ind]=1;
| ^~~~
wall.cpp:83:33: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
83 | else lazymin[ind]=h;ispmin[ind]=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... |