Submission #428979

#TimeUsernameProblemLanguageResultExecution timeMemory
428979MeGustaElArroz23Wall (IOI14_wall)C++14
100 / 100
2273 ms149600 KiB
#include <stdio.h> #include <stdlib.h> #include <assert.h> /////// #include "wall.h" #include<bits/stdc++.h> using namespace std; typedef vector<int> vi; typedef pair<int,int> pii; int INF=2000000000; struct node{ int l; int r; int left; int right; pii minmax; }; pii combine(pii a, pii b){ // a antes que b pii res; res.first=max(a.first,b.first); res.second=min(a.second,b.second); if (res.first>res.second){ if(a.first<b.first) res.second=res.first; else res.first=res.second; } //cerr << a.first << ' '<<a.second << ' '<<b.first<<' '<<b.second<<' '<<res.first<<' '<<res.second<<'\n'; return res; } int counter=0; vector<node> st(5000000); void create_tree(int l, int r){ int ac=counter; st[ac].l=l; st[ac].r=r; st[ac].minmax=pii{0,0}; if (l!=r){ //st[ac].minmax=pii{0,INF}; counter++; st[ac].left=counter; create_tree(l,(l+r)/2); counter++; st[ac].right=counter; create_tree((l+r)/2+1,r); } } void push_tree(int ac, int l, int r, pii x){ if (l==st[ac].l and r==st[ac].r){ st[ac].minmax=combine(st[ac].minmax,x); return; } else{ push_tree( st[ac].left , st[ac].l , (st[ac].l+st[ac].r)/2 , st[ac].minmax ); push_tree( st[ac].right , (st[ac].l+st[ac].r)/2+1 , st[ac].r , st[ac].minmax ); st[ac].minmax=pii{0,INF}; int med=(st[ac].l+st[ac].r)/2; if (l>med){ push_tree(st[ac].right , l , r , x); } else if (r<=med){ push_tree(st[ac].left , l , r , x); } else{ push_tree( st[ac].left , l , med , x ); push_tree( st[ac].right, med+1 , r , x); } return; } } void buildWall(int n, int k, int type[], int left[], int right[], int height[], int finalHeight[]){ create_tree(0,n-1); for (int i=0;i<k;i++){ if (type[i]==1){ push_tree(0,left[i],right[i],pii{height[i],INF}); } else{ push_tree(0,left[i],right[i],pii{0,height[i]}); } //for (int x=0;x<n;x++){ // push_tree(0,x,x,pii{0,INF}); //} //int x=0; //int j=0; //while (x<n){ // if (st[j].l==st[j].r){ // //cerr << st[j].l << ' '<<st[j].minmax.first<<'\n'; // x++; // } // j++; //} } for (int x=0;x<n;x++){ push_tree(0,x,x,pii{0,INF}); } int i=0; int j=0; while (i<n){ if (st[j].l==st[j].r){ finalHeight[st[j].l]=st[j].minmax.first; i++; } j++; } 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...