记录编号 57207 评测结果 AAAAAAAAAA
题目名称 数列 最终得分 100
用户昵称 GravatarQhelDIV 是否通过 通过
代码语言 C++ 运行时间 0.097 s
提交时间 2013-04-07 15:54:02 内存使用 2.22 MiB
显示代码纯文本
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream fin("queueb.in");
ofstream fout("queueb.out");
const int Inf=12345678;
typedef long long ll;
ll N,A[50001],f[50001],g[50001],p[50001],q[50001],tot;
class ST{
public:
	int v,size,n;
	bool pl;
	ST *pr,*suc[2],*Nil;
	ST *GNil();
	void init(int vs){
		v=vs;
		size=n=1;
		pl=0;
		pr=suc[0]=suc[1]=Nil=GNil();
	}
	void mt(){
		if(this!=Nil)
		size=suc[0]->size+suc[1]->size+n;
	}
	void trans(ST *tar,bool place){
		pl=place;
		pr=tar;
		tar->suc[pl]=this;
	}
	void rotate(){
	ST rep=*pr;
	bool repl=pl;
		suc[!pl]->trans(pr,pl);
		pr->trans(this,!pl);
		trans(rep.pr,rep.pl);
		suc[!repl]->mt();
		mt();
	}
	void splay(){
		while(pr!=Nil){
			if(pr->pr!=Nil && pl==pr->pl)
				pr->rotate();
			rotate();
		}
	}
	ST *find_v(int fv){
	ST *p=this,*prev=this;
		while(p!=Nil && prev->v!=fv){
			prev=p;
			if(fv>p->v)
				p=p->suc[1];
			else
				p=p->suc[0];
		}
		return prev;
	}
	ST *insert(int iv){
	ST *p=find_v(iv);
		if(p->v==iv)
			p->n++,p->size++;
		else{
		ST *Nw=new ST;
			Nw->init(iv);
			Nw->trans(p,iv>p->v);
			p=Nw;
		}
		p->splay();
		return p;
	}
}*Nil;
ST *ST::GNil(){return ::Nil;}
void Initialize()
{
int i;
	fin>>N;
	for(i=1;i<=N;i++)
		fin>>A[i];
	Nil=new ST;
	Nil->init(Inf);
	Nil->size=0;
}
void Solve()
{
ll i,j;
	for(i=1;i<=N;i++){
	ST *p=Nil->suc[0]->insert(A[i]);
		f[i]=p->suc[0]->size;
	}
	Nil->init(Inf);
	Nil->size=0;
	for(i=N;i>=1;i--){
	ST *p=Nil->suc[0]->insert(A[i]);
		g[i]=p->suc[0]->size;
	}
	for(i=2;i<N;i++)
		tot+=f[i]*g[i];
	fout<<tot<<endl;
}

int main()
{
	Initialize();
	
	Solve();
	
	fin.close();
	fout.close();
	return 0;
}