?
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/17 20:53
  • 上次更新2024/3/17 23:20:36
查看原帖
?
753640
封禁用户楼主2024/3/17 20:53

不知道为什么要多输几个。

#include<bits/stdc++.h>
#define sd std::
#define ll long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=1e5+10;
int n,tot,root=1;
struct Treap
{
	struct node
	{
		int ls,rs;//左右子节点下标
		int val;//权值
		int pr;//优先级
		int cnt;//重复个数
		int size;//子树大小
	}a[N];
	void update(int p)
	{
		a[p].size=a[a[p].ls].size+a[a[p].rs].size+a[p].cnt;
	}
	void zig(int &p)
	{
		int q=a[p].ls;
		a[p].ls=a[q].rs;//q的右子树变为q的左子树
		a[q].rs=p;
		p=q;
		update(a[p].rs);
		update(p);
	}
	void zag(int &p)
	{
		int q=a[p].rs;
		a[p].rs=a[q].ls;//q的左子树变为p的右子树
		a[q].ls=p;//q变为p的父节点
		p=q;
		update(a[p].ls);
		update(p);
	}
	void insert(int &p,int x)
	{
		if(a[p].val==x)
		{
			a[p].cnt++;
			update(p);
			return;
		}
		if(!p)
		{
			a[++tot].val=x;
			a[tot].pr=read();//随机一个优先级
			a[tot].cnt=1;
			a[tot].size=1;
			p=tot;
			return;
		}
		if(x<a[p].val)
		{
			insert(a[p].ls,x);
			if(a[p].pr<a[a[p].ls].pr) zig(p);//右旋
		}
		if(x>a[p].val)
		{
			insert(a[p].rs,x);
			if(a[p].pr<a[a[p].rs].pr) zag(p);//左旋
		}
		update(p);
	}
	void delet(int &p,int x)
	{
		if(!p) return;
		if(a[p].val==x)
		{
			if(a[p].cnt>1)
			{
				a[p].cnt--;
				update(p);
				return;
			}
			if(a[p].ls||a[p].rs)
			{
				if(a[a[p].ls].pr>a[a[p].rs].pr)zig(p),delet(a[p].rs,x);
				else zag(p),delet(a[p].ls,x);
				update(p);
			}
			else p=0;
			return;
		}
		if(x<a[p].val) delet(a[p].ls,x);
		if(x>a[p].val) delet(a[p].rs,x);
		update(p);
	}
	int get_pre(int x)//前驱
	{
		int ans=-inf;
		int p=root;
		while(p)
		{
			if(x==a[p].val)
			{
				if(a[p].ls)
				{
					p=a[p].ls;
					while(a[p].rs) p=a[p].rs;
					ans=a[p].val;
				}
				break;
			}
			if(a[p].val<x&&a[p].val>ans) ans=a[p].val;//更新最优解
			if(a[p].val<x) p=a[p].rs;
			else p=a[p].ls;
		}
		return ans;
	}
	int get_next(int x)//后继
	{
		int ans=inf;
		int p=root;
		while(p)
		{
			if(x==a[p].val) return x;
			if(a[p].val>x&&a[p].val<ans) ans=a[p].val;
			if(a[p].val<x) p=a[p].rs;
			else p=a[p].ls;
		}
		return ans;
	}
	int get_rank(int p,int k)
	{
		if(a[a[p].ls].size+1<=k&&k<=a[a[p].ls].size+a[p].cnt) return a[p].val;
		if(k<=a[a[p].ls].size) return get_rank(a[p].ls,k);
		return get_rank(a[p].rs,k-(a[a[p].ls].size+a[p].cnt));
	}
	int getx_rank(int p,int x)
	{
		if(!p) return 0;
		if(a[p].val==x) return a[a[p].ls].size+1;
		if(x<a[p].val) return getx_rank(a[p].ls,x);
		return getx_rank(a[p].rs,x)+a[a[p].ls].size+a[p].cnt;
	}
	int find_mi(int p)
	{
		if(p) while(a[p].ls) p=a[p].ls;
		return a[p].val;
	}
	int find_ma(int p)
	{
		if(p) while(a[p].rs) p=a[p].rs;
		return a[p].val;
	}
}T;
int ans,x;
il void solve()
{
	T.a[++tot].val=inf;
	T.a[tot].pr=inf;
	n=read();
	for(int i=1;i<=n;i++)
	{
		x=read();
		if(i==1)
		{
			T.insert(root,x);
			ans+=x;
			continue;
		}
		int mi=T.find_mi(root);
		int ma=T.find_ma(root);
		ans+=MIN(x-mi,ma-x);
		T.insert(root,x);
	}
	put(ans);
}
int main()
{
	int T=1;
	while(T--) solve();
    return 0;
}


2024/3/17 20:53
加载中...