维护一前一后两个栈,正常插入删除。如果某一个栈删空了,将另一个栈的一半扔过去,重构。可以认为两半等价,对于每个元素,只会被扔到对面一次,复杂度

例:CF2026F

vector<int> st,ed;
void push_front(int x){st.pb(x);}
void push_back(int x){ed.pb(x);}
void rebuild(){
	
}
void rebuildfront(){
	int pos=(ed.size()+1)/2;
	for(int i=0;i<pos;i++)st.pb(ed[i]);
	reverse(st.begin(),st.end());
	reverse(ed.begin(),ed.end());
	for(int i=1;i<=pos;i++)ed.pop_back();
	reverse(ed.begin(),ed.end());
	rebuild();
}
void rebuildback(){
	int pos=(st.size()+1)/2;
	for(int i=0;i<pos;i++)ed.pb(st[i]);
	reverse(ed.begin(),ed.end());
	reverse(st.begin(),st.end());
	for(int i=1;i<=pos;i++)st.pop_back();
	reverse(st.begin(),st.end());
	rebuild();
}
int front(){
	if(!st.size())rebuildfront();
	return st.back();
}
int back(){
	if(!ed.size())rebuildback();
	return ed.back();
}
void pop_front(){
	if(!st.size())rebuildfront();
	st.pop_back();
}
void pop_back(){
	if(!ed.size())rebuildback();
	ed.pop_back();
}
int size(){
	return st.size()+ed.size();
}