Guest User

Untitled

a guest
Nov 6th, 2022
1,301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  4. int random(int st, int dr)
  5. {
  6.   uniform_int_distribution<mt19937::result_type> gen(st, dr);
  7.   return gen(rng);
  8. }
  9. vector<int> lg;
  10. struct bit
  11. {
  12.   vector<int> b;
  13.   void resize(int n)
  14.   {
  15.     b.resize(n + 1);
  16.   }
  17.   void update(int pos, int val)
  18.   {
  19.     int n = (int)b.size() - 1;
  20.     for (int i = pos; i <= n; i += i & (-i))
  21.     {
  22.       b[i] += val;
  23.     }
  24.   }
  25.   int query(int pos)
  26.   {
  27.     int ans = 0;
  28.     for (int i = pos; i; i -= i & (-i))
  29.     {
  30.       ans += b[i];
  31.     }
  32.     return ans;
  33.   }
  34.   int query(int st, int dr)
  35.   {
  36.     return query(dr) - query(st - 1);
  37.   }
  38. };
  39. struct stack_rmq
  40. {
  41.   vector<vector<int>> rmq;
  42.   void insert(int val)
  43.   {
  44.     rmq.push_back({val});
  45.     int sz = rmq.size() - 1;
  46.     for (int i = 1; sz - (1 << i) + 1 >= 0; ++i)
  47.     {
  48.       rmq[sz].push_back(
  49.           max(rmq[sz][i - 1], rmq[sz - (1 << (i - 1))][i - 1]));
  50.     }
  51.   }
  52.   void update(int val)
  53.   {
  54.     int sz = (int)rmq.size() - 1;
  55.     int cine = val + rmq[sz][0];
  56.     rmq.pop_back();
  57.     insert(cine);
  58.   }
  59.   int query(int st, int dr)
  60.   {
  61.     if (st > dr)
  62.     {
  63.       return 0;
  64.     }
  65.     int pow_2 = lg[dr - st + 1];
  66.     return max(rmq[dr][pow_2], rmq[st + (1 << pow_2) - 1][pow_2]);
  67.   }
  68. };
  69. struct maximal
  70. {
  71.   stack_rmq lesgo;
  72.   vector<pair<int, int>> ranges;
  73.   vector<int> qui;
  74.   string s;
  75.   int n;
  76.   void build(string _s, int _n)
  77.   {
  78.     s = _s;
  79.     n = _n;
  80.     qui = vector<int>(n + 1);
  81.     bool este = false;
  82.     for (int i = 1; i <= n; ++i)
  83.     {
  84.       if (s[i] == '0')
  85.       {
  86.         if (este)
  87.         {
  88.           lesgo.update(1);
  89.           ranges[(int)ranges.size() - 1].second++;
  90.         }
  91.         else
  92.         {
  93.           lesgo.insert(1);
  94.           ranges.push_back({i, i});
  95.           este = true;
  96.         }
  97.       }
  98.       else
  99.       {
  100.         este = false;
  101.       }
  102.       qui[i] = (int)ranges.size() - 1;
  103.     }
  104.   }
  105.   int query(int st, int dr)
  106.   {
  107.     if (s[st] == '1')
  108.     {
  109.       int l = qui[st] + 1;
  110.       int r = (s[dr] == '0' ? qui[dr] - 1 : qui[dr]);
  111.       int partial = (s[dr] == '0' ? dr - ranges[qui[dr]].first + 1 : 0);
  112.       return max(lesgo.query(l, r), partial);
  113.     }
  114.     if (s[dr] == '1')
  115.     {
  116.       int r = qui[dr];
  117.       int l = qui[st] + 1;
  118.       int partial = (s[st] == '0' ? ranges[qui[st]].second - st + 1 : 0);
  119.       return max(lesgo.query(l, r), partial);
  120.     }
  121.   }
  122.   int next(int lg, int pos, bool fata)
  123.   {
  124.     assert(s[pos] == '1');
  125.     if (fata)
  126.     {
  127.       int st = pos, dr = n;
  128.       int ans = 0;
  129.       while (st <= dr)
  130.       {
  131.         int mid = (st + dr) / 2;
  132.         if (query(pos, mid) <= lg)
  133.         {
  134.           ans = mid;
  135.           st = mid + 1;
  136.         }
  137.         else
  138.         {
  139.           dr = mid - 1;
  140.         }
  141.       }
  142.       return ans;
  143.     }
  144.     else
  145.     {
  146.       int st = 1, dr = pos;
  147.       int ans = 0;
  148.       while (st <= dr)
  149.       {
  150.         int mid = (st + dr) / 2;
  151.         if (query(mid, pos) < lg)
  152.         {
  153.           ans = mid;
  154.           dr = mid - 1;
  155.         }
  156.         else
  157.         {
  158.           st = mid + 1;
  159.         }
  160.       }
  161.       return ans;
  162.     }
  163.   }
  164. };
  165. vector<vector<pair<int, int>>> find_relevant_ranges(string s, int n)
  166. {
  167.   vector<int> sp(n + 1);
  168.   for (int i = 1; i <= n; ++i)
  169.   {
  170.     sp[i] = sp[i - 1] + (s[i] == '1');
  171.   }
  172.   function<int(int, int)> query = [&](int st, int dr)
  173.   {
  174.     return sp[dr] - sp[st - 1];
  175.   };
  176.   vector<vector<pair<int, int>>> cine(n + 1);
  177.   stack_rmq lesgo;
  178.   vector<pair<int, int>> secv;
  179.   bool este = false;
  180.   for (int i = n; i >= 1; --i)
  181.   {
  182.     if (s[i] == '0')
  183.     {
  184.       if (!este)
  185.       {
  186.         lesgo.insert(1);
  187.         secv.push_back({i, i});
  188.         este = true;
  189.       }
  190.       else
  191.       {
  192.         lesgo.update(1);
  193.         secv[(int)secv.size() - 1].first--;
  194.       }
  195.     }
  196.     else
  197.     {
  198.       este = false;
  199.     }
  200.     int cnt = 0;
  201.     int p = i;
  202.     while (p <= n)
  203.     {
  204.       int st = 0, dr = (int)secv.size() - 1;
  205.       int rep = -1;
  206.       while (st <= dr)
  207.       {
  208.         int mid = (st + dr) / 2;
  209.         if (lesgo.query(mid, (int)secv.size() - 1) > cnt)
  210.         {
  211.           rep = mid;
  212.           st = mid + 1;
  213.         }
  214.         else
  215.         {
  216.           dr = mid - 1;
  217.         }
  218.       }
  219.       if (rep == -1)
  220.       {
  221.         cine[i].push_back({p, n});
  222.         break;
  223.       }
  224.       st = secv[rep].first, dr = secv[rep].second;
  225.  
  226.       int l = (dr - st + 1);
  227.       cnt += (secv[rep].first - p);
  228.       if (st != p)
  229.       {
  230.         cine[i].push_back({p, st - 1});
  231.       }
  232.       p = secv[rep].first;
  233.       if (l > cnt)
  234.       {
  235.         if (dr == n)
  236.         {
  237.           break;
  238.         }
  239.         int save = dr + 1;
  240.         bool ok = false;
  241.         for (int j = 0; j < cine[save].size(); ++j)
  242.         {
  243.           if (cine[save][j].second - save + 1 >= l)
  244.           {
  245.             pair<int, int> interv = {max(save + l - 1, cine[save][j].first), cine[save][j].second};
  246.             if (query(interv.first, interv.second))
  247.             {
  248.               int low = interv.first, high = interv.second;
  249.               int qui = -1;
  250.               while (low <= high)
  251.               {
  252.                 int mid = (low + high) / 2;
  253.                 if (query(interv.first, mid))
  254.                 {
  255.                   qui = mid;
  256.                   high = mid - 1;
  257.                 }
  258.                 else
  259.                 {
  260.                   low = mid + 1;
  261.                 }
  262.               }
  263.               cine[i].push_back({qui, qui});
  264.               cnt += (qui - p + 1);
  265.               p = qui + 1;
  266.               ok = true;
  267.               break;
  268.             }
  269.           }
  270.         }
  271.         if (!ok)
  272.         {
  273.           break;
  274.         }
  275.       }
  276.       else
  277.       {
  278.         cine[i].push_back({p, dr});
  279.         cnt += dr - p + 1;
  280.         p = dr + 1;
  281.       }
  282.     }
  283.   }
  284.   return cine;
  285. }
  286.  
  287. vector<vector<pair<int, int>>> cine1, cine2;
  288. int n;
  289. string s;
  290. void smart()
  291. {
  292.   long long ans = 0;
  293.   vector<vector<pair<int, int>>> events1(n + 1);
  294.   vector<vector<pair<int, int>>> events2(n + 1);
  295.   bit tree1;
  296.   bit tree2;
  297.   maximal cine;
  298.   cine.build(s, n);
  299.   tree1.resize(n + 1);
  300.   tree2.resize(n + 1);
  301.   int p1 = 1;
  302.   int p2 = 1;
  303.   for (int i = 1; i <= n; ++i)
  304.   {
  305.     for (auto j : cine1[i])
  306.     {
  307.       events1[j.first].push_back({i, 1});
  308.       if (j.second + 1 <= n)
  309.       {
  310.         events1[j.second + 1].push_back({i, -1});
  311.       }
  312.     }
  313.   }
  314.   for (int i = 1; i <= n; ++i)
  315.   {
  316.     for (auto j : cine2[i])
  317.     {
  318.       events2[j.first].push_back({i, 1});
  319.       if (j.second + 1 <= n)
  320.       {
  321.  
  322.         events2[j.second + 1].push_back({i, -1});
  323.       }
  324.     }
  325.   }
  326.   function<void(int)> move1 = [&](int pos)
  327.   {
  328.     while (p1 <= pos)
  329.     {
  330.       for (auto i : events1[p1])
  331.       {
  332.         tree1.update(i.first, i.second);
  333.       }
  334.       p1++;
  335.     }
  336.   };
  337.   function<void(int)> move2 = [&](int pos)
  338.   {
  339.     while (p2 <= pos)
  340.     {
  341.       for (auto i : events2[p2])
  342.       {
  343.         tree2.update(i.first, i.second);
  344.       }
  345.       p2++;
  346.     }
  347.   };
  348.   for (auto x : cine.ranges)
  349.   {
  350.     int lg = x.second - x.first + 1;
  351.     int l = 0, r = 0;
  352.     int ways1 = 0, ways2 = 0;
  353.     if (x.first - 1 >= 1)
  354.     {
  355.       move1(x.first - 1);
  356.       for (int i = 1; i < lg; ++i)
  357.       {
  358.         int qui = cine.next(i, x.first - 1, false);
  359.         int last = x.first - i;
  360.         if (qui <= last)
  361.         {
  362.           ans += tree1.query(qui, last);
  363.         }
  364.       }
  365.       l = cine.next(lg, x.first - 1, false);
  366.       int last = x.first - lg;
  367.       ways1 = x.first - l + 1;
  368.       if (l <= last)
  369.       {
  370.         ways1 -= tree1.query(l, last);
  371.       }
  372.     }
  373.     else
  374.     {
  375.       l = 1;
  376.       ways1 = 1;
  377.     }
  378.     if (x.second + 1 <= n)
  379.     {
  380.       move2(x.second + 1);
  381.       for (int i = 1; i < lg; ++i)
  382.       {
  383.         int qui = cine.next(i, x.second + 1, true);
  384.         int first = x.second + i;
  385.  
  386.         if (first <= qui)
  387.         {
  388.           ans += tree2.query(first, qui);
  389.         }
  390.       }
  391.       r = cine.next(lg, x.second + 1, true);
  392.       int first = x.second + lg;
  393.       ways2 = r - x.second + 1;
  394.       if (first <= r)
  395.       {
  396.         ways2 -= tree2.query(first, r);
  397.       }
  398.     }
  399.     else
  400.     {
  401.       r = n;
  402.       ways2 = 1;
  403.     }
  404.     ans += 1ll * (r - x.second + 1ll) * (x.first - l + 1ll) - 1ll * ways1 * ways2;
  405.   }
  406.   int lg = 0;
  407.   for (int i = 1; i <= n; ++i)
  408.   {
  409.     if (s[i] == '1')
  410.     {
  411.       lg++;
  412.     }
  413.     else
  414.     {
  415.       ans += 1ll * lg * (lg + 1) / 2;
  416.       lg = 0;
  417.     }
  418.   }
  419.   ans += 1ll * lg * (lg + 1) / 2;
  420.   cout << ans << '\n';
  421. }
  422. int main()
  423. {
  424.   cin.tie(nullptr)->sync_with_stdio(false);
  425.   int q;
  426.   cin >> q;
  427.   while (q--)
  428.   {
  429.     cin >> n >> s;
  430.     lg = vector<int>(n + 1);
  431.     for (int i = 2; i <= n; ++i)
  432.     {
  433.       lg[i] = lg[i / 2] + 1;
  434.     }
  435.     s = '$' + s;
  436.     cine1 = find_relevant_ranges(s, n);
  437.     reverse(s.begin() + 1, s.end());
  438.     cine2 = find_relevant_ranges(s, n);
  439.     reverse(s.begin() + 1, s.end());
  440.     for (int i = 1; i <= n; ++i)
  441.     {
  442.       for (int j = 0; j < (int)cine2[i].size(); ++j)
  443.       {
  444.         cine2[i][j].first = n - cine2[i][j].first + 1;
  445.         cine2[i][j].second = n - cine2[i][j].second + 1;
  446.         swap(cine2[i][j].first, cine2[i][j].second);
  447.       }
  448.       reverse(cine2[i].begin(), cine2[i].end());
  449.     }
  450.     for (int i = 1; i <= n; ++i)
  451.     {
  452.       if (i < (n - i + 1))
  453.       {
  454.         swap(cine2[i], cine2[n - i + 1]);
  455.       }
  456.     }
  457.     smart();
  458.   }
  459. }
Add Comment
Please, Sign In to add comment