Submission #9836

#TimeUsernameProblemLanguageResultExecution timeMemory
9836Qwaz허수아비 (JOI14_scarecrows)C++98
100 / 100
204 ms7336 KiB
#include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int MAX = 200020; struct point { int x, y; bool operator < (const point &t) const { return x < t.x; } }; int n; point data[MAX], tmp[MAX]; void init(){ scanf("%d", &n); int i; for(i = 0; i<n; i++) scanf("%d%d", &data[i].x, &data[i].y); sort(data, data+n); } point lStack[MAX], rStack[MAX]; int lTop, rTop; ll solve(int s, int e){ if(s >= e-1) return 0; int m = (s+e)>>1; ll ans = 0; ans += solve(s, m); ans += solve(m, e); lTop = rTop = 0; int r, l = s; for(r = m; r<e; r++){ while(l < m && data[l].y < data[r].y){ while(lTop && lStack[lTop-1].x < data[l].x) lTop--; lStack[lTop++] = data[l++]; } int minY; while(rTop && rStack[rTop-1].x > data[r].x) rTop--; minY = rTop ? rStack[rTop-1].y : -1; rStack[rTop++] = data[r]; int p = 0, q = lTop, r; while(p < q){ r = (p+q) >> 1; if(lStack[r].y > minY) q = r; else p = r+1; } ans += lTop-p; } int tFull = 0; l = s; r = m; while(1){ if(l == m && r == e) break; if((l < m && data[l].y < data[r].y) || r == e) tmp[tFull++] = data[l++]; else tmp[tFull++] = data[r++]; } int i; for(i = 0; i<tFull; i++) data[s+i] = tmp[i]; return ans; } int main(){ init(); printf("%lld\n", solve(0, n)); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...