首页 > 代码库 > [HNOI2002]营业额统计
[HNOI2002]营业额统计
找不到题目了,试敲了一下感觉还是挺不错的,学习了下别人的代码,差不多能感受到他的强大。哈哈。
sl :可以说算是超级水提了,只要清楚这个数据结构就知道了。
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 using namespace std;
5 const int MAX = 100000+10;
6 int top;
7 struct SBT {
8 int L,R,size,key;
9 void init() {
10 L=R=0; size=1;
11 }
12 }T[MAX];
13
14 void R_Roate(int &t) { // 右旋转
15 int k = T[t].L;
16 T[t].L=T[k].R;
17 T[k].R=t;
18 T[k].size=T[t].size;
19 T[t].size=T[T[t].R].size+T[T[t].L].size+1 ;
20 t=k;
21 return ;
22 }
23 void L_Roate(int &t) { //左旋转
24 int k=T[t].R;
25 T[t].R=T[k].L;
26 T[k].L=t;
27 T[k].size=T[t].size;
28 T[t].size=T[T[t].L].size+T[T[t].R].size+1;
29 t=k;
30 return ;
31 }
32
33 void Maintain(int &t,bool flag) { //调整
34 if(!flag) {
35 if(T[T[T[t].L].L].size>T[T[t].R].size) {
36 R_Roate(t);
37 }
38 else if(T[T[T[t].L].R].size>T[T[t].R].size) {
39 R_Roate(T[t].L);
40 R_Roate(t);
41 }
42 else return ;
43 }
44 else {
45 if(T[T[T[t].R].R].size>T[T[t].L].size) {
46 L_Roate(t);
47 }
48 else if(T[T[T[t].R].L].size>T[T[t].L].size) {
49 R_Roate(T[t].R);
50 L_Roate(t);
51 }
52 else return ;
53 }
54 Maintain(T[t].L,false);
55 Maintain(T[t].R,true);
56 Maintain(t,false);
57 Maintain(t,true);
58 }
59
60 void Insert(int &t,int v) { //插入
61 if(t==0) {
62 t=++top;
63 T[t].init();
64 T[t].key=v;
65 }
66 else {
67 T[t].size++;
68 if(T[t].key>v) Insert(T[t].L,v);
69 else Insert(T[t].R,v);
70 Maintain(t,v>=T[t].key);
71 }
72 }
73 int Pred(int t,int v) { //小于v的最大的数,没有小于v的数字则返回v.
74 if(t==0) {
75 return v;
76 }
77 if(v>T[t].key) {
78 int res=Pred(T[t].R,v);
79 if(res==v) return T[t].key;
80 return res;
81 }
82 else return Pred(T[t].L,v);
83 }
84 int Succ(int t,int v) { //返回大于v的最小的数字,全都小于v则返回v.
85 if(t==0) return v;
86 if(v>=T[t].key) return Succ(T[t].R,v);
87 else {
88 int res=Succ(T[t].L,v);
89 if(v==res) return T[t].key;
90 return res;
91 }
92 }
93
94 int Exist (int t,int v) {
95 if(t==0) return false;
96 if(v<T[t].key) return Exist(T[t].L,v);
97 else if(v==T[t].key) return true;
98 else return Exist(T[t].R,v);
99 }
100
101 int main() {
102 int n,ans=0,root=0,key; top=0;
103 while(scanf("%d",&n)==1) {
104 scanf("%d",&key); ans=0;
105 ans+=key;
106 Insert(root,key);
107 for(int i=2;i<=n;i++) {
108 scanf("%d",&key);
109 if(Exist(root,key)) continue;
110 int P=Pred(root,key),S=Succ(root,key);
111 if(P==key)
112 ans+=abs(key-S);
113 else if(S==key)
114 ans+=abs(key-P);
115 else
116 ans+=min(abs(key-P),abs(key-S));
117 Insert(root,key);
118 }
119 printf("%d\n",ans);
120
121 }
2 #include <cstring>
3 #include <algorithm>
4 using namespace std;
5 const int MAX = 100000+10;
6 int top;
7 struct SBT {
8 int L,R,size,key;
9 void init() {
10 L=R=0; size=1;
11 }
12 }T[MAX];
13
14 void R_Roate(int &t) { // 右旋转
15 int k = T[t].L;
16 T[t].L=T[k].R;
17 T[k].R=t;
18 T[k].size=T[t].size;
19 T[t].size=T[T[t].R].size+T[T[t].L].size+1 ;
20 t=k;
21 return ;
22 }
23 void L_Roate(int &t) { //左旋转
24 int k=T[t].R;
25 T[t].R=T[k].L;
26 T[k].L=t;
27 T[k].size=T[t].size;
28 T[t].size=T[T[t].L].size+T[T[t].R].size+1;
29 t=k;
30 return ;
31 }
32
33 void Maintain(int &t,bool flag) { //调整
34 if(!flag) {
35 if(T[T[T[t].L].L].size>T[T[t].R].size) {
36 R_Roate(t);
37 }
38 else if(T[T[T[t].L].R].size>T[T[t].R].size) {
39 R_Roate(T[t].L);
40 R_Roate(t);
41 }
42 else return ;
43 }
44 else {
45 if(T[T[T[t].R].R].size>T[T[t].L].size) {
46 L_Roate(t);
47 }
48 else if(T[T[T[t].R].L].size>T[T[t].L].size) {
49 R_Roate(T[t].R);
50 L_Roate(t);
51 }
52 else return ;
53 }
54 Maintain(T[t].L,false);
55 Maintain(T[t].R,true);
56 Maintain(t,false);
57 Maintain(t,true);
58 }
59
60 void Insert(int &t,int v) { //插入
61 if(t==0) {
62 t=++top;
63 T[t].init();
64 T[t].key=v;
65 }
66 else {
67 T[t].size++;
68 if(T[t].key>v) Insert(T[t].L,v);
69 else Insert(T[t].R,v);
70 Maintain(t,v>=T[t].key);
71 }
72 }
73 int Pred(int t,int v) { //小于v的最大的数,没有小于v的数字则返回v.
74 if(t==0) {
75 return v;
76 }
77 if(v>T[t].key) {
78 int res=Pred(T[t].R,v);
79 if(res==v) return T[t].key;
80 return res;
81 }
82 else return Pred(T[t].L,v);
83 }
84 int Succ(int t,int v) { //返回大于v的最小的数字,全都小于v则返回v.
85 if(t==0) return v;
86 if(v>=T[t].key) return Succ(T[t].R,v);
87 else {
88 int res=Succ(T[t].L,v);
89 if(v==res) return T[t].key;
90 return res;
91 }
92 }
93
94 int Exist (int t,int v) {
95 if(t==0) return false;
96 if(v<T[t].key) return Exist(T[t].L,v);
97 else if(v==T[t].key) return true;
98 else return Exist(T[t].R,v);
99 }
100
101 int main() {
102 int n,ans=0,root=0,key; top=0;
103 while(scanf("%d",&n)==1) {
104 scanf("%d",&key); ans=0;
105 ans+=key;
106 Insert(root,key);
107 for(int i=2;i<=n;i++) {
108 scanf("%d",&key);
109 if(Exist(root,key)) continue;
110 int P=Pred(root,key),S=Succ(root,key);
111 if(P==key)
112 ans+=abs(key-S);
113 else if(S==key)
114 ans+=abs(key-P);
115 else
116 ans+=min(abs(key-P),abs(key-S));
117 Insert(root,key);
118 }
119 printf("%d\n",ans);
120
121 }
122 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。