Advertisement
Guest User

Untitled

a guest
Jun 27th, 2022
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define pii pair<int,int>
  4. #define pll pair<ll,ll>
  5. #define vi vector<int>
  6. #define vl vector<ll>
  7. #define mp make_pair
  8. #define pb push_back
  9. using namespace std;
  10. const int mxn = 1e5;
  11. int n, nxt[mxn], arr[mxn], tree[mxn*4];
  12. void update(int node, int l, int r, int pos, int value){
  13.     if(l == r){
  14.         tree[node] = value;
  15.     }
  16.     else{
  17.         int mid = (l + r) / 2;
  18.         if(pos <= mid)
  19.             update(node * 2, l, mid, pos, value);
  20.         else
  21.             update(node * 2 + 1, mid + 1, r, pos, value);
  22.              
  23.         tree[node] = tree[node * 2] + tree[node * 2 + 1];
  24.     }
  25. }
  26. int query(int node, int l, int r, int L, int R){
  27.     if(l > R || r < L)
  28.         return 0;
  29.     if(L <= l && r <= R)
  30.         return tree[node];
  31.          
  32.     int mid = (l + r) / 2;
  33.     int left = query(node * 2, l, mid, L, R);
  34.     int right = query(node * 2 + 1, mid + 1, r, L, R);
  35.     return left + right;
  36. }
  37. int main(){
  38.     cin>>n;
  39.     for(int i = 0; i < n; i++){
  40.         cin>>arr[i];
  41.     }
  42.     int lbl = 1;
  43.     map<int,int> label;
  44.     for(int i = 0; i < n; i++){
  45.         if(label[arr[i]])
  46.             continue;
  47.         else{
  48.             label[arr[i]] = lbl++;
  49.         }
  50.     }
  51.     map<int,int> last;
  52.     for(int i = 0; i < n; i++)
  53.         nxt[i] = -1;
  54.     for(int i = n - 1; i >= 0; i--){
  55.         if(last[arr[i]]){
  56.             nxt[i] = last[arr[i]];
  57.             last[arr[i]] = i;
  58.         }
  59.         else{
  60.             last[arr[i]] = i;
  61.         }
  62.     }
  63.     int ans = 0;
  64.     set<int> ones;
  65.     for(int i = n - 1; i >= 0; i--){
  66.         int l = i, r = nxt[i];
  67.         if(nxt[i] == -1)
  68.             continue;
  69.         update(1, 0, n-1,nxt[i], 1);
  70.         if(ones.find(nxt[i]+1) == ones.end());
  71.             ones.insert(nxt[i]);
  72.         if(nxt[nxt[i]] != -1){
  73.             ones.erase(nxt[nxt[i]]);
  74.             update(1, 0, n-1, nxt[nxt[i]], -1);
  75.         }
  76.         if(nxt[nxt[i]] != -1 && nxt[nxt[nxt[i]]] != -1){
  77.             update(1, 0, n-1, nxt[nxt[nxt[i]]], 0);
  78.         }
  79.         for(int j : ones){
  80.             if(j >= i)
  81.                 ans = max(ans, query(1, 0, n-1, i, j));
  82.         }
  83.     }
  84.     cout<<ans<<endl;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement