Advertisement
Dang_Quan_10_Tin

PARRAY

Jun 18th, 2022
847
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll int
  3. #define pb push_back
  4. #define task "PARRAY"
  5. #define pll pair<ll, ll>
  6. #define pii pair<pll, ll>
  7. #define fi first
  8. #define se second
  9.  
  10. using namespace std;
  11. const int mod = 1e9+7;
  12. const int N = 3e5+5;
  13. const int base = 313;
  14. int n, m, t, k, T, ans, tong, c[N], lab[N], st[N*4], lazy[N*4];
  15. int a[N], b[N], d[N];
  16. vector<pll> adj[N];
  17. vector<ll> kq;
  18. string s;
  19. void down(ll id)
  20. {
  21.     if(lazy[id] == mod)return;
  22.     st[id*2] = min(st[id*2], lazy[id]);
  23.     st[id*2+1] = min(st[id*2+1], lazy[id]);
  24.     lazy[id*2] = min(lazy[id*2], lazy[id]);
  25.     lazy[id*2+1] = min(lazy[id*2+1], lazy[id]);
  26.     lazy[id] = mod;
  27. }
  28. void update(ll id, ll l, ll r, ll u, ll v, ll val)
  29. {
  30.     if(u <= l && r <= v)
  31.     {
  32.         st[id] = min(st[id], val);
  33.         lazy[id] = min(lazy[id], val);
  34.         return;
  35.     }
  36.     if(u >  r || l > v || u > v)return;
  37.     ll mid = (l+r)/2;
  38.     down(id);
  39.     update(id*2, l, mid, u, v, val);
  40.     update(id*2+1, mid+1, r, u, v, val);
  41.     st[id] = max(st[id*2], st[id*2+1]);
  42. }
  43. ll get(ll id, ll l, ll r, ll u, ll v)
  44. {
  45.     if(u <= l && r <= v)return st[id];
  46.     if(u > r || l > v || u > v)return 0;
  47.     ll mid = (l+r)/2;
  48.     down(id);
  49.     return max(get(id*2, l, mid, u, v), get(id*2+1, mid+1, r, u, v));
  50. }
  51. void sol()
  52. {
  53.     cin >> n;
  54.     m = 0;
  55.     fill_n(d, n+1, 0);
  56.     for(int i = 1; i <= n; i ++)
  57.     {
  58.         cin >> a[i];
  59.         b[i] = d[a[i]]+1;
  60.         d[a[i]] = i;
  61.     }
  62.     fill_n(st, n*4+4, mod);
  63.     fill_n(lazy, n*4+4, mod);
  64.     fill_n(d, n+1, n+1);
  65.     for(int i = n; i > 0; i --)
  66.     {
  67.         c[i] = d[a[i]] - 1;
  68.         d[a[i]] = i;
  69.  
  70.         //if(i < n)cout << get(1, 1, n, i+1, n) << '\n';
  71.         if(i < n && get(1, 1, n, i+1, n) > i)
  72.         {
  73.             cout << "NO"<<'\n';
  74.             return;
  75.         }
  76.         update(1, 1, n, i, c[i], b[i]);
  77.         //cout << get(1, 1, n, i+1, n) << '\n';
  78.         //cout << b[i] <<" "<<c[i] <<" "<<i<< '\n';
  79.  
  80.     }
  81.     //cout << get(1, 1, n, 3, n) << '\n';
  82.     cout << "YES" << '\n';
  83.  
  84. }
  85. int main()
  86. {
  87.     if(fopen(task".INP", "r"))
  88.     {
  89.        freopen(task".INP", "r", stdin);
  90.        freopen(task".OUT", "w", stdout);
  91.     }
  92.     ios_base::sync_with_stdio(0);
  93.     cin.tie(0);
  94.     cout.tie(0);
  95.     int ntest = 1;
  96.     cin >> ntest;
  97.     while(ntest -- > 0)
  98.     sol();
  99. }
  100.  
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement