1057. Stack

題目限定數的範圍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;
}
相關文章
相關標籤/搜索