Advertisement
Guest User

Untitled

a guest
Nov 8th, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.26 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <stack>
  4. #include <sstream>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <cassert>
  8. #include <ctime>
  9. #include <cmath>
  10. #include <algorithm>
  11. #include <string>
  12. #include <vector>
  13. #include <deque>
  14. #include <queue>
  15. #include <list>
  16. #include <set>
  17. #include <map>
  18. #include <iostream>
  19. using namespace std;
  20.  
  21. //--------------------------------------------
  22. #define SZ(x) ((int)x.size())
  23. #define pb(x) push_back(x)
  24. #define mp(a, b) make_pair(a, b)
  25. #define ALL(X) X.begin(), X.end()
  26. #define SRT(x) sort(ALL(x))
  27. #define RVRS(x) reverse(ALL(x))
  28. #define FILL(x, value) memset(x, value, sizeof(x))
  29.  
  30. #define next next1
  31. #define hash hash1
  32. #define rank rank1
  33.  
  34. #ifdef _DEBUG_
  35. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  36. #else
  37. #define eprintf(...)
  38. #endif
  39.  
  40. #if((_WIN32 || __WIN32__) && __cplusplus < 201103L)
  41. #define LLD "%I64d"
  42. #else
  43. #define LLD "%lld"
  44. #endif
  45.  
  46. template <class T> inline void check_max(T& actual, T check) {
  47. if(actual < check) {
  48. actual = check;
  49. }
  50. }
  51.  
  52. template <class T> inline void check_min(T& actual, T check) {
  53. if(actual > check) {
  54. actual = check;
  55. }
  56. }
  57.  
  58. const double EPS = 1e-9;
  59. const int IINF = 1000000000;
  60. const double PI = acos(-1.0);
  61. const long long LINF = 6000000000000000000LL;
  62. //--------------------------------------------
  63.  
  64. namespace Solution {
  65.  
  66. const int maxN = (int)2e5 + 10;
  67.  
  68. int n, a[maxN];
  69.  
  70. void cleanup() {
  71.  
  72. }
  73.  
  74. bool Read() {
  75. cleanup();
  76. if(scanf("%d", &n) == 1) {
  77. for(int i = 0; i < n; ++i) {
  78. scanf("%d", a + i);
  79. }
  80. return true;
  81. }
  82. return false;
  83. }
  84.  
  85. int get_short_best(set<int>& s) {
  86. int k = *s.begin();
  87. s.erase(s.begin());
  88. int val = *s.rbegin() - *s.begin();
  89. s.insert(k);
  90. int k1 = *s.rbegin();
  91. s.erase(k1);
  92. int val1 = *s.rbegin() - *s.begin();
  93. s.insert(k1);
  94. if(val > val1) {
  95. return k1;
  96. }
  97. return k;
  98. }
  99.  
  100. vector< tuple<int, int, int> > added;
  101. vector< tuple<int, int, int> > removed;
  102.  
  103. int get_min_with_erase(int p, set< tuple<int, int, int> >& st, set<int>& positions, bool apply_changes) {
  104. set<int>::iterator itp = positions.find(p);
  105. set<int>::iterator ktp = itp;
  106. added.resize(0);
  107. removed.resize(0);
  108. if(itp != positions.begin()) {
  109. --itp;
  110. removed.pb(make_tuple(p - *itp, p, *itp));
  111. st.erase(removed.back());
  112. }
  113. else {
  114. itp = positions.end();
  115. }
  116. ++ktp;
  117. if(ktp != positions.end()) {
  118. removed.pb(make_tuple(*ktp - p, *ktp, p));
  119. st.erase(removed.back());
  120. }
  121. if(itp != positions.end() && ktp != positions.end()) {
  122. st.insert(make_tuple(*ktp - *itp, *ktp, *itp));
  123. added.pb(make_tuple(*ktp - *itp, *ktp, *itp));
  124. }
  125. positions.erase(p);
  126. int ret = get<0>(*st.begin());
  127. if(!apply_changes) {
  128. positions.insert(p);
  129. for(int i = 0; i < SZ(added); ++i) {
  130. st.erase(added[i]);
  131. }
  132. for(int i = 0; i < SZ(removed); ++i) {
  133. st.insert(removed[i]);
  134. }
  135. }
  136. return ret;
  137. }
  138.  
  139. void Run() {
  140. int turn = 0;
  141. set<int> positions;
  142. set< tuple< int, int, int > > st;
  143. sort(a, a + n);
  144. for(int i = 0; i < n; ++i) {
  145. positions.insert(a[i]);
  146. }
  147. for(int i = 1; i < n; ++i) {
  148. st.insert(make_tuple(a[i] - a[i - 1], a[i], a[i - 1]));
  149. }
  150. while(SZ(positions) > 2) {
  151. if(turn == 0) { // maximum is minimized
  152. int removal = get_short_best(positions);
  153. if(removal == *positions.begin()) {
  154. set<int>::iterator it = positions.begin();
  155. ++it;
  156. st.erase(make_tuple(*it - removal, *it, removal));
  157. positions.erase(removal);
  158. }
  159. else {
  160. set<int>::iterator it = positions.find(removal);
  161. --it;
  162. st.erase(make_tuple(removal - *it, removal, *it));
  163. positions.erase(removal);
  164. }
  165. }
  166. else { // minimum is maximized
  167. tuple<int, int, int> tp = *st.begin();
  168. int v = get_min_with_erase(get<1>(tp), st, positions, false);
  169. int w = get_min_with_erase(get<2>(tp), st, positions, false);
  170. if(v < w) { // better remove w
  171. get_min_with_erase(get<2>(tp), st, positions, true);
  172. }
  173. else {
  174. get_min_with_erase(get<1>(tp), st, positions, true);
  175. }
  176. }
  177. turn ^= 1;
  178. }
  179.  
  180. printf("%d\n", *positions.rbegin() - *positions.begin());
  181. }
  182.  
  183. } // Solution
  184.  
  185. namespace StressTest {
  186.  
  187. long long GetTime() {
  188. srand(time(NULL));
  189. return rand() << 16LL;
  190. }
  191.  
  192. void GenerateInput() {
  193. FILE* output = fopen("input.txt", "w");
  194. srand(GetTime());
  195.  
  196.  
  197. fclose(output);
  198. }
  199.  
  200. void BruteForce() {
  201. FILE* input = fopen("input.txt", "r");
  202. FILE* output = fopen("brute.out", "w");
  203.  
  204. fclose(input);
  205. fclose(output);
  206. }
  207.  
  208. } // StressTest
  209.  
  210. int main() {
  211. #ifdef _DEBUG_
  212. int test_id = 0;
  213. // StressTest::GenerateInput();
  214. // StressTest::BruteForce();
  215. freopen("input.txt", "r", stdin);
  216. freopen("output.txt", "w", stdout);
  217. #endif
  218.  
  219. while(Solution::Read()) {
  220. #ifdef _DEBUG_
  221. clock_t startTime = clock();
  222. eprintf("Begin of test #%d:\n", ++test_id);
  223. #endif
  224.  
  225. Solution::Run();
  226.  
  227. #ifdef _DEBUG_
  228. clock_t endTime = clock();
  229. eprintf("Time consumed for test #%d is %lf\n", test_id, (double)(endTime - startTime) / (double)CLOCKS_PER_SEC);
  230. #endif
  231. }
  232. return 0;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement