제출 #18099

#제출 시각아이디문제언어결과실행 시간메모리
18099comet벽 (IOI14_wall)C++98
100 / 100
1743 ms55784 KiB
#include "wall.h" #include <cstdio> #include <vector> #include <algorithm> #include <cstring> using namespace std; #define LL 2*k+1 #define RR 2*k+2 int lo[5000010],hi[5000010]; void up(int k){ lo[k]=min(lo[LL],lo[RR]); hi[k]=max(hi[LL],hi[RR]); } void down(int k){ lo[LL]=max(lo[LL],lo[k]); hi[LL]=max(hi[LL],lo[LL]); lo[RR]=max(lo[RR],lo[k]); hi[RR]=max(hi[RR],lo[RR]); hi[LL]=min(hi[LL],hi[k]); lo[LL]=min(lo[LL],hi[LL]); hi[RR]=min(hi[RR],hi[k]); lo[RR]=min(lo[RR],hi[RR]); } void update(int s,int e,int L,int R,int D,int c,int k){ if(e<L||s>R)return; if(L<=s&&e<=R){ if(D==1){ lo[k]=max(lo[k],c); hi[k]=max(hi[k],lo[k]); } if(D==2){ hi[k]=min(hi[k],c); lo[k]=min(lo[k],hi[k]); } return; } down(k); int mid=(s+e)/2; update(s,mid,L,R,D,c,LL); update(mid+1,e,L,R,D,c,RR); up(k); } int query(int s,int e,int x,int k){ if(s==e){ return lo[k]; } down(k); int mid=(s+e)/2; if(x<=mid)return query(s,mid,x,LL); return query(mid+1,e,x,RR); } #undef LL #undef RR void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]){ for(int i=0;i<k;i++){ update(0,n-1,left[i],right[i],op[i],height[i],0); } for(int i=0;i<n;i++){ finalHeight[i]=query(0,n-1,i,0); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...