求救!
查看原帖
求救!
60932
Linno楼主2021/3/15 08:53

如题,样例已过,0分代码,卡了我一晚上。 大佬能帮忙找找错吗?

#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAXN=1000005;

void read(int &data){
	int flag=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') flag=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	data=x*flag;
}

int ch[MAXN][2],sz[MAXN],cnt[MAXN],val[MAXN];
int fa[MAXN],tot,rt,ans=0,INF;

void maintain(int k){sz[k]=sz[ch[k][0]]+sz[ch[k][1]]+cnt[k]; }
void clear(int k){cnt[k]=sz[k]=val[k]=fa[k]=ch[k][0]=ch[k][1]=0;}
bool get(int k){return k==ch[fa[k]][1];};

void rotate(int x) {
    int y=fa[x],z=fa[y],chk=get(x);
    ch[y][chk]=ch[x][chk^1];
    if (ch[x][chk^1]) fa[ch[x][chk^1]]=y;
    ch[x][chk^1]=y;
    fa[y]=x;
    fa[x]=z;
    if(z) ch[z][y==ch[z][1]]=x;
    maintain(x);
    maintain(y);
}

void splay(int x){
	for(int f;f=fa[x];rotate(x)){
		if(fa[f]) rotate(get(x)==get(f)?f:x);
	}
	rt=x;
}

int pre(){
	int cur=ch[rt][0];
	if(cur==0) return INF;
	while(ch[cur][1]) cur=ch[cur][1];
	//splay(cur);
	return val[cur];
}

int nxt(){
	int cur=ch[rt][1];
	if(cur==0) return INF;
	while(ch[cur][0]) cur=ch[cur][0];
	//splay(cur);
	return val[cur];
}

void Insert(int k){
	if(!rt){
		rt=++tot;
		sz[tot]=cnt[tot]=1;
		val[tot]=k;
		maintain(rt);
		return;
	}
	int cur=rt,f=0;
	while(1){
		if(k==val[cur]){
			++cnt[cur];
			maintain(cur);
			maintain(f);
			splay(cur);
			return;
		}
		f=cur,cur=ch[cur][k>val[cur]];
		if(!cur){
			++tot;
			cnt[tot]=sz[tot]=1;
			val[tot]=k;
			fa[tot]=f;
			ch[f][k>val[f]]=tot;
			maintain(f);
			splay(tot);
			return;
		}
	}
}

int main(){
	int n,x,ans;
//	read(n);
	scanf("%d",&n);
	memset(&INF,0x7f,sizeof(INF));
	for(int i=1;i<=n;i++){
		//read(x);
		scanf("%d",&x);
		Insert(x);
		if(i==1) ans+=x;
		else{
			if(cnt[rt]<=1)
			ans+=min(abs(x-pre()),abs(x-nxt()));
		}
	}
//	for(int i=1;i<=n;i++) cout<<fa[i]<<" ";
	printf("%d",ans);
	return 0;
}
2021/3/15 08:53
加载中...