Submission #90387

#TimeUsernameProblemLanguageResultExecution timeMemory
90387Retro3014Wall (IOI14_wall)C++17
61 / 100
1243 ms263168 KiB
#include "wall.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; #define INF 100000 struct S{ int s, e; int l, r; int nmin, nmax; int from; }; vector<S> seg; void init(int x, int y){ int idx=(int)seg.size(); seg.push_back({x, y, -1, -1, 0, 0, -1}); if(x==y){ return; } int m=(x+y)/2; if(x<=m){ seg[idx].l=(int)seg.size(); init(x, m); seg[seg[idx].l].from=idx; } if(m+1<=y){ seg[idx].r=(int)seg.size(); init(m+1, y); seg[seg[idx].r].from=idx; } return; } void updaten(int x){ if(seg[x].from!=-1){ int t=seg[x].from; if(seg[t].nmax<seg[x].nmax){ seg[x].nmax=seg[t].nmax; } if(seg[t].nmax<seg[x].nmin){ seg[x].nmin=seg[t].nmax; } if(seg[t].nmin>seg[x].nmax){ seg[x].nmax=seg[t].nmin; } if(seg[t].nmin>seg[x].nmin){ seg[x].nmin=seg[t].nmin; } } return; } void update(int idx, int li, int ri, int data){ int nx=seg[idx].s, ny=seg[idx].e; if(seg[idx].l!=-1){ updaten(seg[idx].l); } if(seg[idx].r!=-1){ updaten(seg[idx].r); } if(li>ny || ri<nx) return; if(data>0){ if(seg[idx].nmax<data){ seg[idx].nmax=data; } }else{ data=-data; if(seg[idx].nmin>data){ seg[idx].nmin=data; } data=-data; } if(li<=nx && ri>=ny) { if(data>0){ if(seg[idx].nmin<data){ seg[idx].nmin=data; } }else{ data=-data; if(seg[idx].nmax>data){ seg[idx].nmax=data; } data=-data; } return; } if(seg[idx].r!=-1){ update(seg[idx].r, li, ri, data); } if(seg[idx].l!=-1){ update(seg[idx].l, li, ri, data); } seg[idx].nmax=max((seg[idx].r==-1?-1:seg[seg[idx].r].nmax), (seg[idx].l==-1?-1:seg[seg[idx].l].nmax)); seg[idx].nmin=min((seg[idx].r==-1?INF+1:seg[seg[idx].r].nmin), (seg[idx].l==-1?INF+1:seg[seg[idx].l].nmin)); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ init(0, n-1); for(int i=0; i<k; i++){ if(op[i]==1){ update(0, left[i], right[i], height[i]); }else{ update(0, left[i], right[i], -height[i]); } } for(int i=0; i<seg.size(); i++){ updaten(i); if(seg[i].s==seg[i].e){ finalHeight[seg[i].s]=seg[i].nmax; } } return; }

Compilation message (stderr)

wall.cpp: In function 'void buildWall(int, int, int*, int*, int*, int*, int*)':
wall.cpp:111:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0; i<seg.size(); i++){
                  ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...