Submission #337734

#TimeUsernameProblemLanguageResultExecution timeMemory
337734blueWall (IOI14_wall)C++11
100 / 100
1394 ms183020 KiB
#include "wall.h" #include <iostream> #include <algorithm> #include <vector> using namespace std; //Maintain a set of updates, update it at left and right points of every update //Sort the updates by index //Segtree over update indices // // void q(int i) // { // cout << i << '\n'; // } struct segtree { int l; int r; int mn; int mx; segtree* left; segtree* right; segtree(); segtree(int L, int R); void enable(int i, int op, int height); void disable(int i); int rangemin(int L, int R); int rangemax(int L, int R); void printmax(); void printmin(); int binary_search(int suffixMin, int suffixMax); }; vector<int> enable[2000000]; vector<int> disable[2000000]; segtree V[1000000]; int vcount = -1; segtree::segtree() { mn = 1e5 + 1; mx = 0; } segtree::segtree(int L, int R) { l = L; r = R; mn = 1e5 + 1; mx = 0; if(l == r) return; int m = (l+r+2)/2 - 1; //for -1 vcount++; left = &V[vcount]; *left = segtree(l, m); vcount++; right = &V[vcount]; *right = segtree(m+1, r); } void segtree::enable(int i, int op, int height) { if(i < l || r < i) return; if(op == 1) { if(l == r) mx = height; else { left->enable(i, 1, height); right->enable(i, 1, height); mx = max(left->mx, right->mx); } } else { if(l == r) mn = height; else { left->enable(i, 2, height); right->enable(i, 2, height); mn = min(left->mn, right->mn); } } } void segtree::disable(int i) { if(i < l || r < i) return; if(l == r) { mn = 1e5+1; mx = 0; } else { left->disable(i); right->disable(i); mx = max(left->mx, right->mx); mn = min(left->mn, right->mn); } } int segtree::rangemin(int L, int R) { if(R < l || r < L) return 1e5+1; if(L <= l && r <= R) { return mn; } return min(left->rangemin(L, R), right->rangemin(L, R)); } int segtree::rangemax(int L, int R) { if(R < l || r < L) return 0; if(L <= l && r <= R) return mx; return max(left->rangemax(L, R), right->rangemax(L, R)); } void segtree::printmax() { if(left == NULL) cout << mx << ' '; else { left->printmax(); right->printmax(); } } void segtree::printmin() { if(left == NULL) cout << mn << ' '; else { left->printmin(); right->printmin(); } } int segtree::binary_search(int suffixMin = 1e5+1, int suffixMax = 0) { // cout << "search " << a << ' ' << b << '\n'; if(l == r) { if (mn == 1e5+1) return min(suffixMin, mn); else return max(suffixMax, mx); } int m = (l+r+2)/2-1; if (min(suffixMin, right->mn) <= max(suffixMax, right->mx)) return right->binary_search(suffixMin, suffixMax); else return left->binary_search( min(suffixMin, right->mn), max(suffixMax, right->mx)); } segtree* T; int N; int K; //1 = max, 2 = min void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { N = n; K = k; segtree S(-1, k-1); S.enable(-1, 2, 0); T = &S; for(int j = 0; j < k; j++) { enable[left[j]].push_back(j); disable[right[j]].push_back(j); } int temp = 0; for(int i = 0; i < n; i++) { // cout << "i = " << i << '\n'; for(int j: enable[i]) { S.enable(j, op[j], height[j]); // cout << "enable " << j << '\n'; // S.printmax(); // cout << '\n'; // S.printmin(); // cout << '\n'; } if(enable[i].size() != 0 || (i > 0 && disable[i-1].size() != 0)) { temp = T->binary_search(); // cout << temp << '\n'; // cout << "\n\n\n"; } for(int j: disable[i]) { S.disable(j); // cout << "disable " << j << '\n'; // S.printmax(); // cout << '\n'; // S.printmin(); // cout << "\n\n\n"; } finalHeight[i] = temp; } }

Compilation message (stderr)

wall.cpp: In member function 'int segtree::binary_search(int, int)':
wall.cpp:169:9: warning: unused variable 'm' [-Wunused-variable]
  169 |     int m = (l+r+2)/2-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...