Dang_Quan_10_Tin

NEXUS

Mar 15th, 2022 (edited)
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. // https://drive.google.com/file/d/1UddFXyAgbKzDbvuurMHOZauboXSr2i3c/view?usp=sharing
  2. #define task "NEXUS"
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. using ll = long long;
  12. using ld = long double;
  13.  
  14. constexpr int N = 1e5 + 5;
  15. constexpr int Inf = 1e9 + 7;
  16. int n, d, a[N];
  17.  
  18. void Read()
  19. {
  20.     cin >> n >> d;
  21.  
  22.     for (int i = 1; i <= n; ++i)
  23.         cin >> a[i];
  24. }
  25.  
  26. /*Subtask 1*/
  27.  
  28. void Sub_1()
  29. {
  30.     int ans(0);
  31.  
  32.     for (int i = 1; i <= n; ++i)
  33.         for (int j = i; j <= n; ++j)
  34.         {
  35.             for (int t = j, sum(0); t >= i; sum += a[t--] > 0)
  36.                 if (a[t] > t - i || sum + a[t] > d)
  37.                     goto done;
  38.  
  39.             ++ans;
  40.         done:;
  41.         }
  42.  
  43.     cout << ans;
  44. }
  45.  
  46. /*End Subtask 1*/
  47.  
  48. /*Subtask 2*/
  49.  
  50. bool Check(int i, int j)
  51. {
  52.     for (int t = j, sum(0); t >= i; sum += (a[t--] > 0))
  53.         if (sum + a[t] > d)
  54.             return false;
  55.     return true;
  56. }
  57.  
  58. void Sub_2()
  59. {
  60.     int ans(0);
  61.  
  62.     for (int i = 1; i <= n; ++i)
  63.     {
  64.         int l = 1, m, h = i;
  65.         while (l <= h)
  66.         {
  67.             m = (l + h) / 2;
  68.             if (Check(m, i))
  69.                 h = m - 1;
  70.             else
  71.                 l = m + 1;
  72.         }
  73.  
  74.         for (int j = i, minn = Inf; j >= l; --j)
  75.         {
  76.             minn = min(minn, j - a[j]);
  77.             if (j <= minn)
  78.                 ++ans;
  79.         }
  80.     }
  81.  
  82.     cout << ans;
  83. }
  84.  
  85. /* End Subtask 2*/
  86.  
  87. /*Subtask 4*/
  88.  
  89. vector<pair<int, int>> pos;
  90.  
  91. ll DAC(int left, int right)
  92. {
  93.     if (left > right)
  94.         return 0;
  95.  
  96.     int mid = (left + right) / 2;
  97.     ll ans(0);
  98.  
  99.     {
  100.         pos.clear();
  101.         int l = mid, m, h = right;
  102.  
  103.         while (l <= h)
  104.         {
  105.             m = (l + h) / 2;
  106.             if (Check(mid, m))
  107.                 l = m + 1;
  108.             else
  109.                 h = m - 1;
  110.         }
  111.  
  112.         for (int i = mid, minn = Inf, cnt(-(a[mid] > 0)); i <= h; ++i)
  113.         {
  114.             minn = min(minn, i - a[i]);
  115.             cnt += a[i] > 0;
  116.             pos.emplace_back(minn, cnt);
  117.         }
  118.     }
  119.  
  120.     {
  121.         for (int i = mid, j = 0, minn = Inf, cnt = 0, minid = Inf; i >= left; --i)
  122.         {
  123.             while (j < (int)pos.size() && pos[j].first >= i)
  124.                 ++j;
  125.  
  126.             minid = min(minid, i - a[i]);
  127.             minn = min(minn, d - cnt - a[i]);
  128.  
  129.             if (minid >= i)
  130.             {
  131.                 int l = 0, m, h = j - 1;
  132.                 while (l <= h)
  133.                 {
  134.                     m = (l + h) / 2;
  135.                     if (pos[m].second <= minn)
  136.                         l = m + 1;
  137.                     else
  138.                         h = m - 1;
  139.                 }
  140.                 ans += l;
  141.                 // cerr << left << " " << right << " --- " << mid << ": " << i << " " << f.Get(Find(sx, minn + 1) - 1) << "\n";
  142.             }
  143.  
  144.             cnt += a[i] > 0;
  145.         }
  146.     }
  147.  
  148.     ans += DAC(left, mid - 1);
  149.     ans += DAC(mid + 1, right);
  150.  
  151.     return ans;
  152. }
  153.  
  154. void Sub_4()
  155. {
  156.     cout << DAC(1, n);
  157. }
  158.  
  159. /*End Subtask 4*/
  160.  
  161. int32_t main()
  162. {
  163.     ios_base::sync_with_stdio(0);
  164.     cin.tie(0);
  165.     cout.tie(0);
  166.  
  167.     if (fopen(task ".INP", "r"))
  168.     {
  169.         freopen(task ".INP", "r", stdin);
  170.         freopen(task ".OUT", "w", stdout);
  171.     }
  172.  
  173.     Read();
  174.     if (n <= 200)
  175.         Sub_1();
  176.     else if (n <= 2000)
  177.         Sub_2();
  178.     else
  179.         Sub_4();
  180. }
Add Comment
Please, Sign In to add comment