Submission #126197

#TimeUsernameProblemLanguageResultExecution timeMemory
126197StevenHWall (IOI14_wall)C++14
0 / 100
2064 ms8496 KiB
#include "wall.h" #include <iostream> using namespace std; int nn; const int maxn = 100005; struct Wall{ int max,min,val; }wall[maxn*4]; int fh[maxn]; void push_up(int p) { //cout<<p<<endl; if(p>1) { wall[p/2].max=max(wall[p].max,wall[p/2].max); wall[p/2].min=min(wall[p].min,wall[p/2].min); if(wall[p/2].val)wall[p+1].val=wall[p/2].val; wall[p].val=0; push_up(p/2); } } void add(int p,int x,int y,int tx,int ty,int h) { int mid=(x+y)/2; if(y<tx || ty<x)return ; if(tx<=x && y<=ty) // xy在txty中 { if(h>=wall[p].max) // 高度大於區間最高值 全部改 { wall[p].max=h; wall[p].min=h; wall[p].val=h; push_up(p); return ; } else if(h<wall[p].min)return ;//高度小於區間最小 } if(wall[p].val) { wall[p*2].max=wall[p].val; wall[p*2].min=wall[p].val; wall[p*2].val=wall[p].val; } add(p*2,x,mid,tx,ty,h); if(wall[p].val) { wall[p*2+1].max=wall[p].val; wall[p*2+1].min=wall[p].val; wall[p*2+1].val=wall[p].val; } add(p*2+1,mid+1,y,tx,ty,h); wall[p].val=0; return ; } void rmv(int p,int x,int y,int tx,int ty,int h) { int mid=(x+y)/2; if(y<tx || ty<x)return ; if(tx<=x && y<=ty) // xy在txty中 { if(h<=wall[p].min) // 高度小於區間最低值 全部改 { wall[p].max=h; wall[p].min=h; wall[p].val=h; push_up(p); return ; } else if(h>wall[p].max)return ;//高度大於區間最大 捨去 } if(wall[p].val) { wall[p*2].max=wall[p].val; wall[p*2].min=wall[p].val; wall[p*2].val=wall[p].val; } rmv(p*2,x,mid,tx,ty,h); if(wall[p].val) { wall[p*2+1].max=wall[p].val; wall[p*2+1].min=wall[p].val; wall[p*2+1].val=wall[p].val; } rmv(p*2+1,mid+1,y,tx,ty,h); wall[p].val=0; return ; } void find(int p,int x,int y) { if(wall[p].max==wall[p].min) { for(int i=x;i<=y;i++)fh[i]=wall[p].min; return ; } int mid=(x+y)/2; find(p*2,x,mid); find(p*2+1,mid+1,y); return ; } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ for(int i=0;i<k;i++) { if(op[i]==1) { //cout<<"*"; add(1,0,n-1,left[i],right[i],height[i]); } if(op[i]==2) { rmv(1,0,n-1,left[i],right[i],height[i]); } //find(1,0,n-1); //for (int j=0;j<n;j++)printf("%d ", fh[j]); //cout<<endl; } find(1,0,n-1); for(int i=0;i<n;i++)finalHeight[i]=fh[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...