pta-L3-002 特殊堆栈 树状数组+二分

题目

题意:中文题目

题解:关键在于查询中间值,可以用树状数组加二分的方法查找中值,用stl里的栈模拟栈操作即可。

时间复杂度:O(log²(n))

代码:

#include 
#include 
#include 
#include 

using namespace std;
stack sta;
int m;
const int maxn = 1e5+10;
int d[maxn];
int lowbit(int x){
	return x&(-x);
}
void add(int x){
	while(x<=maxn){
		d[x]++;
		x+=lowbit(x);
	}
}
void sub(int x){
	while(x<=maxn){
		d[x]--;
		x+=lowbit(x);
	}
}
int getsum(int x){
	int res=0;
	while(x){
		res+=d[x];
		x-=lowbit(x);
	}
	return res;
}

bool check(int x){
	int n;
	if(sta.size()&1)n=sta.size()/2+1;
	else n=sta.size()/2;
	if(getsum(x)>1;
		if(check(mid))l=mid+1;
		else r=mid;
	}
	return l;
}
int main()
{
	std::ios::sync_with_stdio(false);
	string s;
//	freopen("in.c","r",stdin);
	cin>>m;
	int temp;
	while(m--){
		cin>>s;
		if(s=="Pop"){
			if(sta.empty()){
				cout << "Invalid" << endl;
			}
			else {
				cout <>temp;
			add(temp);
			sta.push(temp);
		}
		else {
			if(sta.empty())cout << "Invalid" << endl;
			else cout << erfen() << endl;
		}
	}
    //cout << "Invalid" << endl;
    return 0;
}

 

你可能感兴趣的:(线段树,二分,STL)