제출 #697226

#제출 시각아이디문제언어결과실행 시간메모리
697226ToroTN벽 (IOI14_wall)C++14
100 / 100
803 ms103288 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...