第一个点TLE?
查看原帖
第一个点TLE?
109634
Cyber_Tree楼主2021/1/27 14:37
#include<bits/stdc++.h>
using namespace std;
const int N=35000;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int n;
int ans;
int tot,rt;
struct TREE{
	int val,siz,sum;
	int fa,son[2];
}t[N];
inline void upd(int p){
	t[p].siz=t[p].sum+t[t[p].son[0]].siz+t[t[p].son[1]].siz;
}
inline bool right(int p){
	return t[t[p].fa].son[1]==p;
}
void rotate(int p){
	int f1=t[p].fa;
	int f2=t[f1].fa;
	bool id=right(p);
	t[f1].son[id]=t[p].son[!id];
	t[t[f1].son[id]].fa=f1;
	t[p].fa=f2;
	t[f2].son[right(f1)]=p;
	t[p].son[!id]=f1;
	t[f1].fa=p;
	upd(f1);
}
void Splay(int p,int to=0){
	while(t[p].fa!=to){
		int f1=t[p].fa,f2=t[f1].fa;
		if(f2!=to){
			if(right(p)==right(f1)) rotate(f1);
			else rotate(p);
		}
		rotate(p);
	}
	upd(p);
	if(!to) rt=p;
}
void find(int x){
	int p=rt;
	while(t[p].son[x>t[p].val]&&x!=t[p].val) p=t[p].son[x>t[p].val];
	Splay(p);
}
bool insert(int x){
	int p=0,now=rt;
	while(now&&x!=t[now].val){
		p=now;
		now=t[now].son[x>t[now].val];
	}
	if(now){
		t[now].sum++;
		return 0;
	}else{
		now=++tot;
		t[now].fa=p;
		t[now].val=x;
		t[now].sum=t[now].siz=1;
		t[p].son[x>t[p].val]=now;
	}
	Splay(now);
	return 1;
}
int pre(int x){
	if(t[rt].val<x) return rt;
	int p=t[rt].son[0];
	while(t[p].son[1]) p=t[p].son[1];
	return p;
}
int nxt(int x){
	if(t[rt].val>x) return rt;
	int p=t[rt].son[1];
	while(t[p].son[0]) p=t[p].son[0];
	return p;
}
void del(int x){
	if(!insert(x)) return;
	find(x);
	int pr=pre(x);
	int nt=nxt(x);
//	printf("//%d\n",min(abs(t[pr].val-x),abs(t[nt].val-x)));
	ans+=min(abs(t[pr].val-x),abs(t[nt].val-x));
}
int main(void){
	n=read();
	int x;
	insert(0x3f3f3f3f);
	insert(-0x3f3f3f3f);
	ans=read();
	insert(ans);
	for(int i=2;i<=n;i++){
		x=read();
		del(x);
	}
	printf("%d\n",ans);
	return 0;
}

萌新刚学数据结构。

第一个点为什么会被TLE?疑似屎循环?

求助各位大佬。。。

感激不尽。。

2021/1/27 14:37
加载中...