Splay入门题目 [HNOI2002]营业额统计
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588
这道题貌似很多中做法,我先是用multiset交了一发,然后又写了一发splay。
multiset做法,这个其实就是二分了,只是用set来保持加入一个元素时保持有序
1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <ctime> 5 #include <queue> 6 #include <stack> 7 #include <cctype> 8 #include <cstdio> 9 #include <string> 10 #include <vector> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 typedef unsigned long long ull; 17 typedef long long ll; 18 const int inf = 0x3f3f3f3f; 19 const double eps = 1e-8; 20 multiset<int>S; 21 multiset<int>::iterator it; 22 int main(void) 23 { 24 #ifndef ONLINE_JUDGE 25 freopen("in.txt","r",stdin); 26 #endif 27 int n; 28 while (~scanf ("%d",&n)) 29 { 30 int ans = 0; 31 S.clear(); 32 for (int i = 0; i < n; i++) 33 { 34 int x; 35 if (scanf ("%d",&x) == EOF) 36 x = 0; 37 it = S.lower_bound(x); 38 if (it == S.begin()) 39 ans += abs(*it-x); 40 else 41 { 42 int s1 = *it; 43 int s2 = *--it; 44 ans += min(abs(s1 - x),abs(s2 - x)); 45 } 46 S.insert(x); 47 } 48 printf("%d\n",ans); 49 } 50 return 0; 51 }
splay
1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <ctime> 5 #include <queue> 6 #include <stack> 7 #include <cctype> 8 #include <cstdio> 9 #include <string> 10 #include <vector> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 typedef unsigned long long ull; 17 typedef long long ll; 18 const int inf = 0x3f3f3f3f; 19 const double eps = 1e-8; 20 template <class T> 21 inline bool scan_d(T &ret) 22 { 23 char c; 24 int sgn; 25 if(c=getchar(),c==EOF) 26 return 0; 27 while(c!='-'&&(c<'0'||c>'9')) 28 c=getchar(); 29 sgn = (c=='-')?-1:1; 30 ret =(c=='-')?0:(c-'0'); 31 while(c=getchar(),c>='0'&&c<='9') 32 ret=ret*10+(c-'0'); 33 ret*=sgn; 34 return 1; 35 } 36 const int maxn = 1e5+10; 37 int fa[maxn],son[maxn][2],key[maxn],tot,root; 38 39 40 41 void addNode(int &r,int father,int k) 42 { 43 r = ++tot; 44 fa[r] = father; 45 key[r] = k; 46 son[r][0] = son[r][1] = 0; 47 } 48 49 void Rotate(int r,int kind) 50 { 51 int y = fa[r]; 52 son[y][!kind] = son[r][kind]; 53 fa[son[r][kind]] = y; 54 if (fa[y]) 55 son[fa[y]][son[fa[y]][1]==y] = r; 56 son[r][kind] = y; 57 fa[r] = fa[y]; 58 fa[y] = r; 59 } 60 void splay(int r,int goal) 61 { 62 while (fa[r] != goal) 63 { 64 if (fa[fa[r]] == goal) 65 { 66 Rotate(r,son[fa[r]][0] == r); 67 } 68 else 69 { 70 int y = fa[r]; 71 int kind = (son[fa[y]][0] == y); 72 if (son[y][kind] == r) 73 { 74 Rotate(r,!kind); 75 Rotate(r,kind); 76 } 77 else 78 { 79 Rotate(y,kind); 80 Rotate(r,kind); 81 } 82 } 83 } 84 if (goal == 0) 85 root = r; 86 } 87 bool Insert(int k) 88 { 89 int r = root; 90 while (son[r][k > key[r]]) 91 { 92 if (k == key[r]) 93 { 94 splay(r,0); 95 return false; 96 } 97 r = son[r][k>key[r]]; 98 } 99 addNode(son[r][k>key[r]],r,k); 100 splay(son[r][k>key[r]],0); 101 return true; 102 } 103 int get_pre(int r) 104 { 105 int tmp = son[r][0]; 106 if (tmp == 0) 107 return inf; 108 while (son[tmp][1]) 109 tmp = son[tmp][1]; 110 return key[tmp]; 111 } 112 int get_next(int r) 113 { 114 int tmp = son[r][1]; 115 if (tmp==0) 116 return inf; 117 while (son[tmp][0]) 118 tmp = son[tmp][0]; 119 return key[tmp] ; 120 } 121 int main(void) 122 { 123 #ifndef ONLINE_JUDGE 124 freopen("in.txt","r",stdin); 125 #endif 126 int n; 127 while (~scanf ("%d",&n)) 128 { 129 tot = 0; 130 root = 0; 131 int ans = 0; 132 for (int i = 0; i < n; i++) 133 { 134 int x; 135 if (scanf ("%d",&x) == EOF) 136 x = 0; 137 if (i == 0) 138 { 139 ans += x; 140 addNode(root,0,x); 141 } 142 else 143 { 144 if (!Insert(x)) 145 continue; 146 int l = get_pre(root); 147 int r = get_next(root); 148 ans += min(abs(x-l),abs(x-r)); 149 //ans += min(l,r); 150 } 151 } 152 printf("%d\n",ans); 153 } 154 return 0; 155 }