BOJ 9426: 중앙값 측정 작성일 2020-03-04 https://www.acmicpc.net/problem/9426 3월동안 210문제 풀기 (12/210) Multimap이라는 치트를 써서 Running Median으로 어거지로 품 실제로는 Segment Tree로 풀린다고 함. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899#include <bits/stdc++.h> using namespace std; struct RunningMedian { multiset<int> minq, maxq; void push(int x) { if(maxq.empty() || maxq.size() == minq.size()) maxq.insert(x); else minq.insert(x); if(minq.size() && *maxq.rbegin() > *minq.begin()) { auto it = maxq.end(); it--; minq.insert(*it); maxq.erase(it); maxq.insert(*minq.begin()); minq.erase(minq.begin()); } } void remove(int x) { if(minq.empty() || x <= *maxq.rbegin()) { auto it = maxq.find(x); maxq.erase(it); } else { auto it = minq.find(x); minq.erase(it); } if(maxq.size()+1 == minq.size()) { maxq.insert(*minq.begin()); minq.erase(minq.begin()); } if(maxq.size() == 2+ minq.size()) { auto it = maxq.end(); it--; minq.insert(*it); maxq.erase(it); } } int median() { return *maxq.rbegin(); } }; #include <sys/stat.h> #include <sys/mman.h> class fio { size_t rsize; unsigned char* rbuf; int ridx; public: fio() : ridx(0) { struct stat rstat; fstat(0, &rstat); rsize = rstat.st_size; rbuf = (unsigned char*)mmap(0,rsize,PROT_READ,MAP_FILE|MAP_PRIVATE,0,0); } inline bool isBlank() { return rbuf[ridx] == '\n' || rbuf[ridx] == '\t' || rbuf[ridx] == '\r' || rbuf[ridx] == '\f' || rbuf[ridx] == '\v' || rbuf[ridx] == ' '; } inline void consumeBlank() { while (isBlank()) ridx++; } inline int readInt(){ int res = 0, flag = 0; consumeBlank(); if (rbuf[ridx] == '-'){ flag = 1; ridx++; } while (!isBlank() && ridx < rsize) res = 10 * res + rbuf[ridx++] - '0'; return flag ? -res : res; } }; fio io; int main() { int N, K; vector<int> arr; N = io.readInt(); K = io.readInt(); RunningMedian rm; arr.reserve(N); for(int i = 0; i < N; i++) arr.push_back(io.readInt()); for(int i = 0; i < K-1; i++) rm.push(arr[i]); long long ans = 0; for(int i = K-1; i < N; i++) { rm.push(arr[i]); ans += rm.median(); rm.remove(arr[i-K+1]); } cout << ans; }