ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[APIO2012]派遣

2020-01-27 12:00:11  阅读:230  来源: 互联网

标签:cnt rs APIO2012 ll son int 派遣 sum


[APIO2012]派遣

枚举所有忍者在哪棵子树内, 答案即为本子树内最多派遣的忍者数乘上子树根在原树中祖先最强的领导力, dfs用可并堆合并两棵子树即可, 这道题用不着用并查集维护连通性

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;

template <typename T>
void read(T &x) {
    x = 0; bool f = 0;
    char c = getchar();
    for (;!isdigit(c);c=getchar()) if (c=='-') f=1;
    for (;isdigit(c);c=getchar()) x=x*10+(c^48);
    if (f) x=-x;
}

template <typename T>
void write(T x) {
    if (x < 0) putchar('-'), x = -x;
    if (x >= 10) write(x / 10);
    putchar('0' + x % 10);
}

const int N = 105000;
ll n, m;

inline ll Mx(ll x, ll y) {return x > y ? x : y;}
ll c[N], L[N];
int h[N], to[N], ne[N];
int tot;
inline void add(int x, int y) {
    ne[++tot] = h[x], to[tot] = y, h[x] = tot;
}

int T[N], val[N], f[N], dis[N];
int son[N][2];

#define rs son[x][1]
#define ls son[x][0]
int merge(int x, int y) {
    if (!x || !y) return x | y;
    if (c[x] < c[y]) swap(x, y);
    rs = merge(rs, y);
    if (dis[ls] < dis[rs]) swap(ls, rs);
    dis[x] = dis[rs] + 1;
    return x;
}

ll sum[N], cnt[N], ans;
void dfs(int x) {
    T[x] = x; sum[x] = c[x], cnt[x] = 1;
    for (int i = h[x]; i; i = ne[i]) {
        int y = to[i]; L[y] = Mx(L[x], L[y]);
        dfs(y); T[x] = merge(T[x], T[y]);
        sum[x] += sum[y], cnt[x] += cnt[y];
    }
    while (sum[x] > m) {
        sum[x] -= c[T[x]]; cnt[x]--;
        T[x] = merge(son[T[x]][0], son[T[x]][1]);
    }
    ans = Mx(ans, cnt[x] * L[x]);
}

int main() {
    read(n), read(m);
    for (int i = 1;i <= n; i++) {
        int b; read(b); add(b, i);
        read(c[i]), read(L[i]);
    } dfs(1);
    cout << ans << endl;
    return 0;
}

标签:cnt,rs,APIO2012,ll,son,int,派遣,sum
来源: https://www.cnblogs.com/Hs-black/p/12235634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有