|
地板
楼主 |
发表于 2020-4-11 13:05:04
|
只看该作者
先来一个基本的BST,不带任何调整的,锻炼下插入和查找,交上去,还得了70分,不错,说明基本功还在,出题人显然也考虑到了。况且只是十几年前的,当时的电脑还没有现在这么快!
- #include<bits/stdc++.h>
- using namespace std;
- const int inf=0x3FFFFFFF;
- const int N=100100;
- struct node
- {
- int val,cnt,s[2];
- } a[N];
- int n,x,ans,tot,root;
- void BSTPr(int rt)
- {
- if (a[rt].s[0]>0) BSTPr(a[rt].s[0]);
- cout<<a[rt].val<<' ';
- if (a[rt].s[1]>0) BSTPr(a[rt].s[1]);
- }
- void Ins(int & rt,int x)
- {
- if (rt==0)
- {
- rt=++tot;
- a[rt].val=x;
- a[rt].cnt=1;
- }
- else if (a[rt].val==x) a[rt].cnt++; ///其实可以不要
- else
- {
- int k=a[rt].val<x;/// k=0 表示左
- Ins(a[rt].s[k],x);
- }
- }
- int Find(int rt,int x)
- {
- if (rt==0) return 0;
- if (a[rt].val==x) return rt;
- int k=a[rt].val<x; /// k=0表示左子树中去1表示去右子树
- return Find(a[rt].s[k],x);
- }
- int Pre(int rt, int x)
- {
- if(rt==0) return 0;
- if(a[rt].val>=x) return Pre(a[rt].s[0],x);//递归查找左子树
- else
- {
- int t=Pre(a[rt].s[1],x);
- if (t==0) return rt;
- else if (a[t].val<a[rt].val) return rt;//找右子树中是否存在前驱
- else return t;
- }
- }
- int Suc(int rt, int x) ///大于x的最小
- {
- int p=rt, ans=0;
- while(p>0)
- {
- if(a[p].val<=x) p=a[p].s[1];
- else
- {
- ans=p;
- p=a[p].s[0];
- }
- }
- return ans;
- }
- int main()
- {
- cin>>n>>x;
- ans=x,root=1,tot=1,a[1].val=x;
- int p0,p1,p2,x1,x2;
- for(int i=2; i<=n; i++)
- {
- ///BSTPr(root);
- cin>>x;
- p0=Find(root,x);
- if (p0==0)
- {
- p1=Pre(root,x);
- p2=Suc(root,x);
- x1=x2=inf;
- if (p1>0) x1=(x-a[p1].val);
- if (p2>0) x2=(a[p2].val-x);
- ans+=min(x1,x2);
- Ins(root,x);
- }
- }
- cout<<ans;
- return 0;
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|