제출 #105918

#제출 시각아이디문제언어결과실행 시간메모리
105918tincamatei쌀 창고 (IOI11_ricehub)C++14
100 / 100
53 ms6544 KiB
#include <bits/stdc++.h> #include "ricehub.h" using namespace std; const int MAX_N = 100; struct MedianStructure { set<pair<int, int> > data; set<pair<int, int> >::iterator median; long long sumdists; MedianStructure() { sumdists = 0LL; median = data.end(); } void moveMedian(int dir) { sumdists -= dir * median->first; if(dir == 1) median++; else median--; sumdists -= dir * median->first; } void insert(int val, int poz) { pair<int, int> x = make_pair(val, poz); data.insert(x); if(data.size() == 1) median = data.begin(); else if(x < *median) { sumdists -= val; if(data.size() % 2 == 0) moveMedian(-1); } else { sumdists += val; if(data.size() % 2 == 1) moveMedian(+1); } } void erase(int val, int poz) { pair<int, int> x = make_pair(val, poz); if(x < *median) { sumdists += val; data.erase(x); if(data.size() % 2 == 1) moveMedian(1); } else if(x > *median) { sumdists -= val; if(data.size() % 2 == 1) moveMedian(-1); data.erase(x); } else if(data.size() % 2 == 0) { moveMedian(1); data.erase(x); sumdists += val; } else { moveMedian(-1); data.erase(x); sumdists -= val; } } long long getmediansum() { return sumdists - median->first * (1 - data.size() % 2); } }; int besthub(int R, int L, int X[], long long B) { int l; int rez = 1; MedianStructure *med = new MedianStructure(); // X[l...r] works l = 0; for(int r = 0; r < R; ++r) { med->insert(X[r], r); while(l < r && med->getmediansum() > B) { med->erase(X[l], l); l++; } rez = max(rez, r - l + 1); } return rez; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...