題目限定數的範圍N<=100000算法
關鍵點:構建樹狀數組能夠求解前n個數的和數組
由此push和pop時要維護樹狀數組,當須要求解median時,使用二分法code
由此總的算法複雜度爲O(N*logN+N*logn*logN)=O(N*logN*logN)cmd
// 1057. Stack (30).cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include <stdio.h> #include <string.h> const int N = 100003; int ind[N]; int data[N]; int vol[N]; int ssize; int lowbit(int x){ return x & (-x); } void update(int pos, int inc){ while(pos <= N){ ind[pos] += inc; pos += lowbit(pos); } } int sum(int pos){ int ret = 0; while(pos > 0){ ret += ind[pos]; pos -= lowbit(pos); } return ret; } //binarySearch the minimum value x that sum(x) = keyValue(the ascend sorting index of median) int binarySearch(int low, int high, int keyValue){ while(low <= high){ int mid = (low + high) / 2; int tmpSum = sum(mid); if(keyValue <= tmpSum) high = mid - 1; else low = mid + 1; } return low; } int main(){ int cas; scanf("%d", &cas); memset(ind, 0, sizeof(ind)); memset(vol, 0, sizeof(vol)); char cmd[13]; ssize = 0; while(cas--){ scanf("%s", cmd); if(cmd[1] == 'u'){ int tmp; scanf("%d", &tmp); data[ssize] = tmp; vol[tmp]++; update(tmp, 1); ssize++; } else if(cmd[1] == 'o'){ if(ssize == 0) printf("Invalid\n"); else{ update(data[--ssize], -1); printf("%d\n", data[ssize]); } } else{ if(ssize == 0) printf("Invalid\n"); else{ int keyValue = (ssize & 0x01) ? (ssize + 1) / 2 : (ssize / 2); int ans = binarySearch(1, N, keyValue); printf("%d\n", ans); } } } return 0; }