제출 #97363

#제출 시각아이디문제언어결과실행 시간메모리
97363fefe벽 (IOI14_wall)C++17
100 / 100
1658 ms120568 KiB
#include "wall.h" #include<bits/stdc++.h> #define MAX_N 2000005 #define inf 1000005 using namespace std; struct Tree{ int l,r,x; }t[4*MAX_N]; void add(int x,int v,int b){ if(b==1){ if(v<=t[x].l) return; if(t[x].l<v && t[x].r>v){ t[x].l=v; t[x].x=1; return; } t[x].l=t[x].r=v; t[x].x=0; }else{ if(t[x].r<=v) return; if(t[x].l<=v && t[x].r>v){ t[x].r=v; t[x].x=0; return; } t[x].l=t[x].r=v; t[x].x=1; } } void spread(int x,int y){ if(t[x].x){ add(y,t[x].l,1); add(y,t[x].r,2); }else{ add(y,t[x].r,2); add(y,t[x].l,1); } } void update(int x,int l,int r,int s,int e,int v,int b){ if(l!=r){ spread(x,2*x); spread(x,2*x+1); t[x]={0,inf,0}; } if(e<l || r<s) return; if(s<=l && r<=e){ add(x,v,b); return; } int mid=(l+r)>>1; update(2*x,l,mid,s,e,v,b); update(2*x+1,mid+1,r,s,e,v,b); } int calc(int x,int v,int b){ if(b==1) return (x<v?v:x); else return (x>v?v:x); } int get(int x,int l,int r,int p){ if(l==r) return t[x].l; int mid=(l+r)>>1,q; if(p<=mid) q=get(2*x,l,mid,p); else q=get(2*x+1,mid+1,r,p); if(t[x].x==0) q=calc(calc(q,t[x].l,1),t[x].r,2); else q=calc(calc(q,t[x].r,2),t[x].l,1); return q; } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ int i; for(i=0;i<=4*n;i++) t[i]={0,inf,0}; for(i=0;i<k;i++){ update(1,0,n-1,left[i],right[i],height[i],op[i]); } for(i=0;i<n;i++) finalHeight[i]=get(1,0,n-1,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...