[Apio2012]dispatching 主席树+dfs序

标签: dfs序 主席树
9人阅读 评论(0) 收藏 举报
分类:

Description
给你一棵树,你可以选择一个节点,一个节点有两个值ai、bi,你可以选择它子树里ai总和不超过M的k个点,那么这个节点的价值bi*k,求整棵树的最大价值。


Sample Input
5 4
0 3 3
1 3 5
2 2 2
1 2 4
2 3 1


Sample Output
6


好像不难吧。。。
这道题考虑用主席树做,我们首先有一个贪心的思想,对于一颗子树你肯定是先取ai最小的点,然后再次,再次,那就是求最多能取排名前k个数使它的值小于M,这个东西考虑用主席树维护,然后dfs序一下,维护最大值即可。


#include <cstdio>
#include <cstring>

using namespace std;
typedef long long LL;
LL _max(LL x, LL y) {return x > y ? x : y;}
LL _min(LL x, LL y) {return x < y ? x : y;}

struct edge {
    int x, y, next;
} e[210000]; int len, last[110000];
struct node {
    int lc, rc;
    LL c, sum;
} t[30 * 110000]; int cnt, rt[110000];
int id, ll[110000], rr[110000];
int a[110000], c[110000];

void ins(int x, int y) {
    e[++len].x = x; e[len].y = y;
    e[len].next = last[x]; last[x] = len;
}

void Link(int &u, int l, int r, int p, int c) {
    if(!u) u = ++cnt;
    t[u].c++; t[u].sum += c;
    if(l == r) return ;
    int mid = (l + r) / 2;
    if(p <= mid) Link(t[u].lc, l, mid, p, c);
    else Link(t[u].rc, mid + 1, r, p, c);
}

void Merge(int &u1, int u2) {
    if(!u1 || !u2) {u1 = u1 + u2; return ;}
    t[u1].c += t[u2].c; t[u1].sum += t[u2].sum;
    Merge(t[u1].lc, t[u2].lc);
    Merge(t[u1].rc, t[u2].rc);
}

LL query(int u1, int u2, int l, int r, LL s) {
    if(l == r) return _min(t[u2].c - t[u1].c, s / l);
    LL c = t[t[u2].lc].sum - t[t[u1].lc].sum;
    int k = t[t[u2].lc].c - t[t[u1].lc].c;
    int mid = (l + r) / 2;
    if(c > s) return query(t[u1].lc, t[u2].lc, l, mid, s);
    else return k + query(t[u1].rc, t[u2].rc, mid + 1, r, s - c);
}

void dfs(int x, int fa) {
    ll[x] = ++id;
    for(int k = last[x]; k; k = e[k].next) {
        int y = e[k].y;
        if(fa != y) dfs(y, x);
    }
    rr[x] = id;
}

int main() {
    int n, m; scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) {
        int x; scanf("%d%d%d", &x, &c[i], &a[i]);
        ins(x, i); ins(i, x);
    } dfs(1, 0);
    for(int i = 1; i <= n; i++) {
        int x = ll[i];
        Link(rt[x], 1, 1000000000, c[i], c[i]);
    }
    for(int i = 1; i <= n; i++) Merge(rt[i], rt[i - 1]);
    LL ans = 0;
    for(int i = 1; i <= n; i++) {
        LL hh = query(rt[ll[i] - 1], rt[rr[i]], 1, 1000000000, m);
        ans = _max(ans, hh * a[i]);
    }
    printf("%lld\n", ans);
    return 0;
}
查看评论

【bzoj2809】[Apio2012]dispatching 主席树+dfs序

这分明就是一道主席树傻逼题呀,在dfs序上建出主席树,每次在主席树上二分就可以了。 #include #include #include #include #include #include...
  • u012288458
  • u012288458
  • 2016-05-23 20:46:05
  • 428

[dfs序+主席树] BZOJ2809: [Apio2012]dispatching

题意在一个忍者的帮派里,一些忍者们将被选中派遣给顾客。 在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级。 所有与他们工作相关的指令总是由上级发送...
  • CHHNZ
  • CHHNZ
  • 2017-04-19 09:01:51
  • 325

Bzoj2809:[Apio2012]dispatching:左偏树

题目链接:2809:[Apio2012]dispatching 考虑对于以节点x为根的一颗子树,我们只要在m的限制下尽量多地选择忍者即可,这个可以用大根堆维护 考虑x向x的父亲y转移时,相当于y的...
  • qq_34025203
  • qq_34025203
  • 2016-04-29 10:17:32
  • 360

APIO2012 dispatching(dfs序+主席树)

Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级...
  • RecLxf
  • RecLxf
  • 2015-12-06 17:36:01
  • 194

[BZOJ2809][Apio2012]dispatching(dfs序+主席树)

智慧是宝石,如果用谦虚镶边,就会更加灿烂夺目。——高尔基
  • Blue_CuSO4
  • Blue_CuSO4
  • 2017-12-18 19:05:37
  • 107

[BZOJ 2809][Apio2012]dispatching:可持久化线段树|可并堆

点击这里查看原题对于每个忍者被作为管理者的情况,我们需要知道这个忍者管理的忍者中最多能选多少忍者,而要使选的忍者尽可能多,就需要从薪水最低的忍者开始选。 于是可以建立一颗权值线段树,按DFS序将忍者...
  • SmallSXJ
  • SmallSXJ
  • 2017-05-04 14:33:08
  • 157

bzoj2809: [Apio2012]dispatching(DFS序+主席树)

题目传送门 。 解法: 对于每个节点。 选他做管理员。 满意度为领导力*子树最多选多少人。 需解决子树最多选多少人。 考虑主席树。 既然是子树。肯定要用到DFS序。 DFS之后子树的...
  • Hanks_o
  • Hanks_o
  • 2018-04-07 17:14:41
  • 36

BZOJ 2809: [Apio2012]dispatching

题目地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题目大意:在一棵树中,每个节点有2个权值(我们不妨称其为val1和val2)。求...
  • u013703661
  • u013703661
  • 2014-03-09 09:19:10
  • 1319

2809: [Apio2012]dispatching

题意:给你一棵树,每个点有点权Ci,Li,选取尽量多的节点,使得SUM CI
  • MatouKariya
  • MatouKariya
  • 2015-05-11 15:36:10
  • 451

BZOJ 2809 [Apio2012]dispatching 可并堆

BZOJ 2809 [Apio2012]dispatching 可并堆
  • wzq_QwQ
  • wzq_QwQ
  • 2015-07-23 20:31:33
  • 933
    个人资料
    持之以恒
    等级:
    访问量: 8641
    积分: 652
    排名: 7万+
    文章存档
    最新评论