#include<bits/stdc++.h>
using namespace std;
long long w[100007],sum[100007];
int fa[100007],degree[100007],dp[100007],depth[100007];
int flag[100007];
int vis[100007];
int find_x(int x)//非递归并查集
{
    int k, j, r;
    r = x;
    while(r != dp[r])     //查找根节点
        r = dp[r];      //找到根节点,用r记录下
    k = x;
    while(k != r)             //非递归路径压缩操作
    {
        j = dp[k];         //用j暂存parent[k]的父节点
        dp[k] = r;        //fa[x]指向根节点
        k = j;                    //k移到父节点
    }
    return r;         //返回根节点的值
}
int main(){
    int n,l;
    long long s;
    scanf("%d%d%lld",&n,&l,&s);
    for(int i=1;i<=n;i++){
        scanf("%lld",&w[i]);
        if(w[i]>s)//这个权重超重
            return puts("-1"),0;
    }
    for(int i=2;i<=n;i++){
        scanf("%d",&fa[i]);
        degree[fa[i]]++;//双亲结点度数+1
    }
    for(int i=1;i<=n;i++){
        dp[i]=i;
        depth[i]=depth[fa[i]]+1;//深度为双亲结点深度+1
        sum[i]=sum[fa[i]]+w[i];//这一点的总权重为双亲结点总权重+自己权重
    }
    int h=0,cnt=0,ans=0;
    for(int i=1;i<=n;i++){
        if(!degree[i])//i为叶子节点
            flag[cnt++]=i;//记录叶子节点位置
    }
    while(h<cnt){
        int x=flag[h++];
        if(vis[x])
            continue;
        ans++;
        int num=0;
        long long val=0;
        while(x){
            int next=find_x(x);//第一次是自己,之后是祖先(它被合并入它的双亲)
            if(vis[next]==1)//当它变成祖先时,这个向上贪心的点已经被选中
                break;//这句去掉一样能过,多跑15ms,感觉加上比较好
            num+=depth[x]-depth[next]+1;//这一条路的节点数
            val+=sum[x]-sum[next]+w[next];////这一条路的总权重
            if(num>l||val>s)//超长或者超重就停止,无法继续贪心
                break;
            vis[next]=1;//这个节点已经被选中,所有的点都只能被选中一次
            degree[fa[next]]--;//next的双亲结点度数减一
            if(!degree[fa[next]])//如果nect的双亲结点成为叶子节点
                flag[cnt++]=fa[next];//记录它的位置
            dp[next]=find_x(fa[dp[next]]);//把这个点并到它父亲里
            x=fa[next];//贪心它的父亲
        }
    }
    printf("%d\n",ans);
    return 0;
}
/*while(h<t)
    {
        int x=q[h++];
        if(vis[x]) continue;
        ++Ans;
        int num=0; LL s=0;
        while(x)
        {
            int nxt=Find(x);
            num+=depth[x]-depth[nxt]+1, s+=sum[x]-sum[nxt]+w[nxt];
            if(num>L||s>S) break;
            vis[nxt]=1;
            if(!--dgr[fa[nxt]]) q[t++]=fa[nxt];
            F[nxt]=Find(fa[F[nxt]]), x=fa[nxt];
        }
    }
    printf("%d\n",Ans);*/

Codeforces#514E(贪心,并查集)的更多相关文章

  1. Codeforces 437D 贪心+并查集

    这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij ...

  2. POJ 1456 Supermarket(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...

  3. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

  4. codeforces 651E E. Table Compression(贪心+并查集)

    题目链接: E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  5. Codeforces 731C Socks 并查集

    题目:http://codeforces.com/contest/731/problem/C 思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为 ...

  6. codeforces 722C (并查集)

    题目链接:http://codeforces.com/contest/722/problem/C 题意:每次破坏一个数,求每次操作后的最大连续子串和. 思路:并查集逆向操作 #include<b ...

  7. poj1456(贪心+并查集)

    题目链接: http://poj.org/problem?id=1456 题意: 有n个商品, 已知每个商品的价格和销售截止日期, 每销售一件商品需要花费一天, 即一天只能销售一件商品, 问最多能买多 ...

  8. POJ - 1456 贪心+并查集

    做法一:直接贪心,按照利润排序,然后直接尽量给每个活动安排到最晚的时间即可.时间复杂度O(n * d)当d都为10000时,很容易超时.由于这题数据比较水,所有贪心未超时. AC代码 #include ...

  9. poj1456 Supermarket 贪心+并查集

    题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...

随机推荐

  1. 仿新浪游戏频道js多栏目全屏下拉菜单导航条

    仿新浪游戏频道js多栏目全屏下拉菜单导航条,新浪,游戏频道,js组件,多栏目,全屏下拉,下拉菜单,导航条.代码下载地址:http://www.huiyi8.com/sc/26765.html更多请访问 ...

  2. 英语发音规则---/ŋ/与/ŋg/的读音区别

    英语发音规则---/ŋ/与/ŋg/的读音区别 一.总结 一句话总结: 1.位于词中间的字母组合ng,有时读作/ ŋ /,有时读作/ ŋg/? singer ['sɪŋə] n. 歌手 ringing ...

  3. 具有增、删、改、查功能的vue-tree树组件

    最近写了一个具有增删改查功能的多级树组件,感觉很实用,啦啦啦啦, 废话不多说,看代码: tree.vue <template> <div> <div class=&quo ...

  4. 数据库中的id不会自动 替换,这个应该处理吗。怎么处理,那个是唯一主键

  5. 2.4 AppDelegate 的 3 个生命周期

    Classed/AppDelegate.cpp 文件内容如下: #include "cocos2d.h" #include "CCEGLView.h" #inc ...

  6. Web视频播放 之 【HTML5 Video标签】

    一.说明 HTML5中引入了video标签用于方便的在浏览器中播放视频,不在需要对flashPlayer进行依赖,更加轻量级.但在浏览器兼容.视频协议支持方面还有一些需要注意的问题. 二.浏览器兼容 ...

  7. BestCoder Round #92 比赛记录

    上午考完试后看到了晚上的BestCoder比赛,全机房都来参加 感觉压力好大啊QAQ,要被虐了. 7:00 比赛开始了,迅速点进了T1 大呼这好水啊!告诉了同桌怎么看中文题面 然后就开始码码码,4分1 ...

  8. 【Caffe】Ubuntu 安装 Caffe gpu版

    安装环境:Ubuntu 16.04lts 64位, gcc5.4 gpu1050ti,cuda8.0,cudnn5.1.10 1. 安装依赖库 sudo apt-get install libprot ...

  9. 批量清除过期的binlog释放磁盘空间

    方案,总共24台db,一台台进去清理肯定不行,得需要写一个脚本,进行批量操作,方案思路大概如下 1,  建立双master列表masterlist; 一个master一行. 2,远程获取master ...

  10. Python:os.walk()和os.path.walk()用法

    转于:https://www.cnblogs.com/zmlctt/p/4222621.html 博主:zmlctt 一.os.walk() 函数声明:os.walk(top,topdown=True ...