EntropyIncreaser

LOJR6T2 花团

Nov 27th, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. #include <algorithm>
  5.  
  6. #define LOG(FMT...) // fprintf(stderr, FMT)
  7.  
  8. using namespace std;
  9.  
  10. struct lst {
  11.     int v, w;
  12.     lst* next;
  13. };
  14.  
  15. struct seg {
  16.     int l, r, lv;
  17.     lst* d;
  18.     seg *ls, *rs;
  19. };
  20.  
  21. const int N = 15010, LOGN = 18;
  22.  
  23. int n, maxv, t, lastans, curx;
  24. int dp[LOGN][N];
  25. seg* root;
  26.  
  27. seg* build(int l, int r, int lv);
  28. lst* create(int v, int w, lst* next);
  29. void dfs(seg* p);
  30. void change(seg* p, int l, int r, int v, int w);
  31.  
  32. int main() {
  33. //  freopen("test.in", "r", stdin);
  34.     scanf("%d%d%d", &n, &maxv, &t);
  35.     memset(dp[0] + 1, -1, sizeof(int) * maxv);
  36.     root = build(1, n, 1);
  37.     dfs(root);
  38.     return 0;
  39. }
  40.  
  41. seg* build(int l, int r, int lv) {
  42.     static seg pool[N << 1];
  43.     static int cnt;
  44.     seg* p = pool + cnt;
  45.     ++cnt;
  46.     p->l = l;
  47.     p->r = r;
  48.     p->lv = lv;
  49.     if (l == r)
  50.         return p;
  51.     int mid = (l + r) >> 1;
  52.     p->ls = build(l, mid, lv + 1);
  53.     p->rs = build(mid + 1, r, lv + 1);
  54.     return p;
  55. }
  56.  
  57. void dfs(seg* p) {
  58.     int lv = p->lv;
  59.     memcpy(dp[lv], dp[lv - 1], sizeof(int) * (maxv + 1));
  60.     for (lst* q = p->d; q; q = q->next) {
  61.         for (int i = maxv; i >= q->v; --i)
  62.             if (~dp[lv][i - q->v])
  63.                 dp[lv][i] = max(dp[lv][i], dp[lv][i - q->v] + q->w);
  64.     }
  65.     if (p->ls) {
  66.         dfs(p->ls);
  67.         dfs(p->rs);
  68.         return;
  69.     }
  70.     int op, v, w, e;
  71.     scanf("%d%d", &op, &v);
  72.     curx = p->l;
  73.     v -= t * lastans;
  74.     if (op == 1) {
  75.         scanf("%d%d", &w, &e);
  76.         LOG("#%d %d %d\n", v, w, e);
  77.         w -= t * lastans;
  78.         e -= t * lastans;
  79.         change(root, curx, e, v, w);
  80.         return;
  81.     }
  82.     LOG("#%d\n", v);
  83.     if (!~dp[lv][v]) {
  84.         puts("0 0");
  85.         lastans = 0;
  86.     } else {
  87.         lastans = dp[lv][v] ^ 1;
  88.         printf("1 %d\n", dp[lv][v]);
  89.     }
  90. }
  91.  
  92. void change(seg* p, int l, int r, int v, int w) {
  93.     if (p->l == l && p->r == r) {
  94.         p->d = create(v, w, p->d);
  95.         if (p->l <= curx && curx <= p->r)
  96.             for (int j = p->lv; j < LOGN; ++j)
  97.                 for (int i = maxv; i >= v; --i)
  98.                     if (~dp[j][i - v])
  99.                         dp[j][i] = max(dp[j][i], dp[j][i - v] + w);
  100.         return;
  101.     }
  102.     if (p->ls->r >= r)
  103.         change(p->ls, l, r, v, w);
  104.     else if (p->rs->l <= l)
  105.         change(p->rs, l, r, v, w);
  106.     else {
  107.         change(p->ls, l, p->ls->r, v, w);
  108.         change(p->rs, p->rs->l, r, v, w);
  109.     }
  110. }
  111.  
  112. lst* create(int v, int w, lst* next) {
  113.     static lst pool[N * LOGN];
  114.     static lst* p = pool;
  115.     ++p;
  116.     p->v = v;
  117.     p->w = w;
  118.     p->next = next;
  119.     return p;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment