Advertisement
K_Y_M_bl_C

Untitled

Sep 21st, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.82 KB | None | 0 0
  1. void dfs(int tl, int tr, int sum, vector<Item> &q, bitset<250001> &dp, vector<int> &cnt)
  2. {
  3.     vector<Item> ql, qr;
  4.     for (auto &x : q)
  5.     {
  6.         if (x.l <= tl && tr <= x.r)
  7.         {
  8.             sum += x.val;
  9.             dp |= dp << x.val;
  10.         }
  11.     }
  12.     if (tl == tr)
  13.     {
  14.         for (int i = 0; i < 250001 && 2 * i < sum; ++i)
  15.         {
  16.             if (!dp[i])
  17.                 continue;
  18.             ++cnt[sum - 2 * i];
  19.         }
  20.         return;
  21.     }
  22.     int tm = tl + tr >> 1;
  23.     for (auto &x : q)
  24.     {
  25.         if (x.l <= tl && tr <= x.r)
  26.             continue;
  27.         if (intersect(x.l, x.r, tl, tm))
  28.             ql.inb(x);
  29.         if (intersect(x.l, x.r, tm + 1, tr))
  30.             qr.inb(x);
  31.     }
  32.     q.clear();
  33.     bitset<250001> ndp = dp;
  34.     dfs(tl, tm, sum, ql, dp, cnt);
  35.     dfs(tm + 1, tr, sum, qr, ndp, cnt);
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement