Advertisement
_rashed

UVA 10534

Jul 6th, 2022
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8. ll arr[10000];
  9. set<ll> arr_c;
  10. ll f[10000];
  11. ll b[10000];
  12.  
  13. ll nodes[50000];
  14. int n;
  15.  
  16. void build(int l = 0, int r = n-1, int p = 1) {
  17.     if(l == r) {
  18.         nodes[p] = 0;
  19.     }
  20.     else {
  21.         int mid = (r+l)/2;
  22.         build(l,mid,p*2);
  23.         build(mid+1,r,p*2+1);
  24.         nodes[p] = 0;
  25.     }
  26. }
  27.  
  28. ll query(int ql, int qr, int l = 0, int r = n-1, int p = 1) {
  29.     if(l >= ql && r <= qr) {
  30.         return nodes[p];
  31.     }
  32.     if(qr < l || ql > r) {
  33.         return 0;
  34.     }
  35.     int mid = (r+l)/2;
  36.     return max(query(ql,qr,l,mid,p*2),query(ql,qr,mid+1,r,p*2+1));
  37. }
  38.  
  39. void update(int qt, ll qv, int l = 0, int r = n-1, int p = 1) {
  40.     if(l == r) {
  41.         nodes[p] = max(qv,nodes[p]);
  42.     }
  43.     else {
  44.         int mid = (l+r)/2;
  45.         if(qt <= mid) {
  46.             update(qt,qv,l,mid,p*2);
  47.         }
  48.         else {
  49.             update(qt,qv,mid+1,r,p*2+1);
  50.         }
  51.         nodes[p] = max(nodes[p*2],nodes[p*2+1]);
  52.     }
  53. }
  54.  
  55. map<ll,ll> mp;
  56.  
  57. int main()
  58. {
  59.     ios_base::sync_with_stdio(false);
  60.     cin.tie(NULL);
  61.     cout.tie(NULL);
  62.  
  63.     while(cin >> n) {
  64.     //for(int ti = 0; ti < 75; ti++) {
  65.         //n = 10000;
  66.         arr_c.clear();
  67.         mp.clear();
  68.         for(int i = 0; i < n; i++) {
  69.             cin >> arr[i];
  70.             //arr[i] = (i < n/2 ? i:n-i);
  71.             arr_c.insert(arr[i]);
  72.         }
  73.         int idx = 0;
  74.         for(int v : arr_c) {
  75.             mp[v] = idx++;
  76.         }
  77.         for(int i = 0; i < n; i++) {
  78.             arr[i] = mp[arr[i]];
  79.         }
  80.         build();
  81.         for(int i = 0; i < n; i++) {
  82.             if(!arr[i]) {
  83.                 f[i] = 1;
  84.             }
  85.             else {
  86.                 f[i] = 1+query(0,arr[i]-1);
  87.             }
  88.             update(arr[i],f[i]);
  89.         }
  90.         build();
  91.         //memset(nodes,0,sizeof(nodes));
  92.         for(int i = n-1; i >= 0; i--) {
  93.             if(!arr[i]) {
  94.                 b[i] = 1;
  95.             }
  96.             else {
  97.                 b[i] = 1+query(0,arr[i]-1);
  98.             }
  99.             update(arr[i],b[i]);
  100.         }
  101.         ll ans = 1;
  102.         /*cout << "arr is: ";
  103.         for(int i = 0; i < n; i++) {
  104.             cout << arr[i] << " ";
  105.         }
  106.         cout << "\n";*/
  107.         for(int i = 0; i < n; i++) {
  108.             if(!f[i] || !b[i])
  109.                 continue;
  110.             //cout << " at i = " << i << " l = " << f[i] << " r = " << b[i] << "\n";
  111.             ans = max(ans,1+min(f[i]-1,b[i]-1)*2);
  112.         }
  113.         cout << ans << "\n";
  114.     }
  115.     return 0;
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement