Advertisement
chang2394

Untitled

Sep 21st, 2014
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. /* Madara Uchiha */
  5. #define TRACE
  6.  
  7. #ifdef TRACE
  8. #define dbgarr(a,n) cerr << "["; for(int i = 0; i < n; ++i) cerr << a[i] << " ";cerr << "\b]\n";
  9. #define dbg(args...) {debug,args; cerr<<endl;}
  10. #define pause() cin.get();cin.get();
  11.  
  12. #else
  13. #define dbgarr(a,n)
  14. #define dbg(args...)
  15. #define pause()
  16.  
  17. #endif
  18.  
  19. struct debugger {
  20. template<typename T> debugger& operator , (const T& v) {
  21. cerr<<v<<" "; return *this;
  22. }
  23. } debug;
  24.  
  25. template <typename T1, typename T2>
  26. inline ostream& operator << (ostream& os, const pair<T1, T2>& p) {
  27. return os << "(" << p.first << ", " << p.second << ")";
  28. }
  29.  
  30. template<typename T>
  31. inline ostream &operator << (ostream & os,const vector<T>& v) {
  32. bool first = true; os << "[";
  33. for (typename vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii) {
  34. if(!first) os << ", ";
  35. os << *ii; first = false;
  36. }
  37. return os << "]";
  38. }
  39.  
  40. #define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
  41. #define fr first
  42. #define se second
  43. typedef long long LL;
  44. typedef pair<int,int> pii;
  45. typedef vector<int> vi;
  46.  
  47. // for each i find (a,b,c,d) ,such that d = i and a is max
  48. const int NN = (1 << 20);
  49.  
  50. int match[NN], seg[2*NN];
  51. int inp[NN], od[NN];
  52. int nxt[NN], prev[NN];
  53.  
  54. void update(int node,int st,int en,int ind){
  55. if (st == en){
  56. seg[node] = nxt[ind];
  57. return;
  58. }
  59.  
  60. int mid = (st+en)/2;
  61. if (mid >= ind) update(2*node,st,mid,ind);
  62. else update(2*node+1,mid+1,en,ind);
  63. seg[node] = max(seg[2*node],seg[2*node+1]);
  64. }
  65.  
  66. int query(int node,int st,int en,int L,int R,int rng){
  67. if (st > R or en < L or st > en) return -1;
  68. if (st >= L and en <= R){
  69. if (seg[node] <= rng) return -1;
  70. if (st == en) return st;
  71. int mid = (st+en)/2;
  72. if (seg[2*node+1] > rng)
  73. return query(2*node+1,mid+1,en,L,R,rng);
  74. return query(2*node,st,mid,L,R,rng);
  75. }
  76.  
  77. int mid = (st+en)/2, ans = -1;
  78. if (mid >= L)
  79. ans = max(ans,query(2*node,st,mid,L,R,rng));
  80. if (mid+1 <= R)
  81. ans = max(ans,query(2*node+1,mid+1,en,L,R,rng));
  82. return ans;
  83. }
  84.  
  85. bool cmp1(int x,int y){
  86. if (inp[x] == inp[y])
  87. return (x < y);
  88. return (inp[x] < inp[y]);
  89. }
  90.  
  91. bool cmp2(int x,int y){
  92. if (nxt[x] == nxt[y])
  93. return (x < y);
  94. return (nxt[x] < nxt[y]);
  95. }
  96.  
  97. void solve(){
  98. int n;
  99. cin >> n;
  100.  
  101. memset(seg,-1,sizeof(seg));
  102. for(int i = 0; i < n; ++i){
  103. cin >> inp[i], od[i] = i;
  104. nxt[i] = n+5, prev[i] = -2;
  105. match[i] = -1;
  106. }
  107.  
  108. sort(od,od+n,cmp1);
  109. for(int i = 0; i < n; ++i){
  110. int x = od[i];
  111. if (i+1 < n and inp[od[i+1]] == inp[x] and od[i+1] > x+1)
  112. nxt[x] = od[i+1];
  113. else if (i+2 < n and inp[od[i+2]] == inp[x])
  114. nxt[x] = od[i+2];
  115. if (i-1 >= 0 and inp[od[i-1]] == inp[x] and od[i-1] < x-1)
  116. prev[x] = od[i-1];
  117. else if (i-2 >= 0 and inp[od[i-2]] == inp[x])
  118. prev[x] = od[i-2];
  119.  
  120. assert(nxt[i] > i+1);
  121. assert(prev[i] < i-1);
  122. }
  123.  
  124. for(int i = 0; i < n; ++i)
  125. od[i] = i;
  126.  
  127. sort(od,od+n,cmp2);
  128. for(int i = 0, j = 0; i < n; ++i){
  129. while(j < n and nxt[od[j]] < i)
  130. update(1,0,n-1,od[j]), ++j;
  131.  
  132. int x = prev[i];
  133. if (x <= 0) continue;
  134. match[i] = query(1,0,n-1,0,x-1,x);
  135. }
  136.  
  137. vi ans;
  138. for(int i = 0, k = 0; i < n; ++i){
  139. if (match[i] >= k){
  140. ans.push_back(match[i]);
  141. ans.push_back(i);
  142. ans.push_back(match[i]);
  143. ans.push_back(i);
  144. k = i+1;
  145. }
  146. }
  147.  
  148. int m = (int)ans.size();
  149. cout << m << endl;
  150. for(int i = 0; i < m; ++i)
  151. cout << inp[ans[i]] << " ";
  152. cout << endl;
  153. }
  154.  
  155. int main()
  156. {
  157. ios_base::sync_with_stdio(0);
  158. solve();
  159. return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement