Dang_Quan_10_Tin

Untitled

Jul 15th, 2020
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #define NguyenDangQuan the_author
  2.  
  3. #include <bits/stdc++.h>
  4. #define all(x) x.begin(),x.end()
  5. #define mset(x, i) memset(x,i,sizeof(x))
  6. #define elif else if
  7. #define heap priority_queue
  8. #define fi first
  9. #define se second
  10. #define pb push_back
  11. #define ld long double
  12. #define ll long long
  13. #define ull unsigned long long
  14. using namespace std;
  15.  
  16. int typetest;
  17.  
  18. inline void fastIOfileinput(){
  19.     ios_base:: sync_with_stdio(0);
  20.     cin.tie(0);
  21.     cout.tie(0);
  22.     typetest = 0;
  23. }
  24.  
  25. template<class T>
  26. void read(T &x){
  27.     register int c;
  28.     x = (T)0;
  29.     while ((c = getchar()) <= 47 || c >= 58);
  30.     for (; (c > 47 && c < 58); c = getchar()){
  31.         x = (x << 3) + (x << 1) + (T)(c - 48);
  32.     }
  33. }
  34.  
  35. const int N = 1e5 + 2;
  36. const int Inf = 1e7 + 1;
  37. int n, a[N];
  38. int stmax[N * 4];
  39.  
  40. void Enter(){
  41.     //cin >> n;
  42.     read(n);
  43.     for(int i = 1; i <= n; ++i)
  44.         //cin >> a[i];
  45.         read(a[i]);
  46. }
  47.  
  48. void build(int id, int l, int r){
  49.     if(l == r){
  50.         stmax[id] = a[l];
  51.         return;
  52.     }
  53.     build(id << 1, l, (l + r) / 2);
  54.     build(id << 1 | 1, (l + r) / 2 + 1, r);
  55.     stmax[id] = max(stmax[id << 1], stmax[id << 1 | 1]);
  56. }
  57.  
  58. int get(int id, int l, int r, int a, int b){
  59.     if(l > b || r < a)
  60.         return -Inf;
  61.     if(l >= a && r <= b)
  62.         return stmax[id];
  63.     int s = get(id << 1, l, (l + r) / 2, a, b),
  64.         p = get(id << 1 | 1, (l + r) / 2 + 1, r, a, b);
  65.     return max(s, p);
  66. }
  67.  
  68. int sum[4 * N];
  69.  
  70. void updat(int id, int l, int r, int pos, int val){
  71.     if(l > pos || r < pos)
  72.         return;
  73.     if(l == pos && r == pos){
  74.         sum[id] = val;
  75.         return;
  76.     }
  77.     updat(id << 1, l, (l + r) / 2, pos, val);
  78.     updat(id << 1 | 1, (l + r) / 2 + 1, r, pos, val);
  79.     sum[id] = sum[id << 1] + sum[id << 1 | 1];
  80. }
  81.  
  82. int que(int id, int l, int r, int a, int b){
  83.     if(l > b || r < a)
  84.         return 0;
  85.     if(l >= a && r <= b)
  86.         return sum[id];
  87.     return que(id << 1, l, (l + r) / 2, a, b) + que(id << 1 | 1, (l + r) / 2 + 1, r, a, b);
  88. }
  89.  
  90. void solve(){
  91.     build(1, 1, n);
  92.     int res = 0;
  93.     int last[N];
  94.     for(int i = 1; i <= n; ++i){
  95.         updat(1, 1, n, i, 1);
  96.         updat(1, 1, n, last[a[i]], 0);
  97.         last[a[i]] = i;
  98.         for(int j = max(max(a[i], res + 1), i - last[1] + 1); j <= i && que(1, 1, n, i - j + 1, i) == j;){
  99.             int s = get(1, 1, n, i - j + 1, i);
  100.             if(s == j)
  101.                 res = max(res, j),
  102.                 ++j;
  103.             else
  104.                 j = s;
  105.         }
  106.     }
  107.     cout << res;
  108. }
  109.  
  110. signed main(){
  111.     fastIOfileinput();
  112.     if(typetest){
  113.         int t;
  114.         cin >> t;
  115.         while(t--){
  116.             Enter();
  117.             solve();
  118.         }
  119.     }
  120.     else{
  121.         Enter();
  122.         solve();
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment