萌新刚学OI,splay TLE on #1
查看原帖
萌新刚学OI,splay TLE on #1
541145
Fleeing_loser楼主2022/7/12 17:42
#include<bits/stdc++.h>
#define maxn 33010
#define INF 0x3f3f3f3f
using namespace std;
struct node
{
	int f,son[2],date;
}t[maxn];
int root,cnt;
inline int read()
{
    int f=1;
	int x=0;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*=f;
}
void rotate(int x)
{
	int y=t[x].f,z=t[y].f,kk=t[y].son[1]==x,cd=t[x].son[kk^1];
	if(z) t[z].son[t[z].son[1]==y]=x;
	t[x].f=z;  t[cd].f=y;
	t[y].son[kk]=cd; t[x].son[kk^1]=y;
	t[y].f=x;
	return ;
}
void splay(int x)
{
	while(t[x].f)
	{
		int y=t[x].f,z=t[y].f;
		if(z) (t[z].son[1]==y)^(t[y].son[1]==x)?rotate(x):rotate(y);
		rotate(x);
	}
	root=x;
	return ;
}
void insert(int val)
{
	int ff=0,x=root;
	while(x) ff=x,x=t[x].date>val?t[x].son[0]:t[x].son[1];
	if(t[ff].date==val) return;
	x=++cnt;
	if(ff) t[ff].son[t[ff].date<val]=x;
	t[x].f=ff;
	t[x].date=val;
	splay(x); 
	return;
}
int getmin(int x,int val)
{
	if(!x) return INF;
	return t[x].date>=val?min(t[x].date,getmin(t[x].son[0],val)):getmin(t[x].son[1],val);
}
int getmax(int x,int val)
{
	if(!x) return -INF;
	return t[x].date<=val?max(t[x].date,getmax(t[x].son[1],val)):getmax(t[x].son[0],val);
}
int main()
{
   	int n,x,ans=0;
   	n=read();
   	for(int i=1;i<=n;++i)
   	{
   		x=read();
   		if(i==1) ans+=x;
   		else ans+=min(x-getmax(root,x),getmin(root,x)-x);
   		insert(x);
	}
	printf("%d\n",ans);
    return 0;
}
2022/7/12 17:42
加载中...