Mitya and Vasya are playing an interesting game. They have a rooted tree with n vertices, and the vertices are indexed from 1 to n. The root has index 1. Every other vertex i≥2 has its parent pi, and vertex i is called a child of vertex pi

.

There are some cookies in every vertex of the tree: there are xi

cookies in vertex i. It takes exactly ti time for Mitya to eat one cookie in vertex i. There is also a chip, which is initially located in the root of the tree, and it takes li time to move the chip along the edge connecting vertex i

with its parent.

Mitya and Vasya take turns playing, Mitya goes first.

  • Mitya moves the chip from the vertex, where the chip is located, to one of its children.
  • Vasya can remove an edge from the vertex, where the chip is located, to one of its children. Vasya can also decide to skip his turn.

Mitya can stop the game at any his turn. Once he stops the game, he moves the chip up to the root, eating some cookies along his way. Mitya can decide how many cookies he would like to eat in every vertex on his way. The total time spent on descend, ascend and eating cookies should not exceed T

. Please note that in the end of the game the chip is always located in the root of the tree: Mitya can not leave the chip in any other vertex, even if he has already eaten enough cookies — he must move the chip back to the root (and every move from vertex v to its parent takes lv

time).

Find out what is the maximum number of cookies Mitya can eat, regardless of Vasya's actions.

Input

The first line contains two integers n

and T — the number of vertices in the tree and the time he has to accomplish his task (2≤n≤105; 1≤T≤1018

).

The second line contains n

integers x1, x2, ..., xn — number of cookies located in the corresponding vertex (1≤xi≤106). The third line contains n integers t1, t2, ..., tn — how much time it takes Mitya to eat one cookie in vertex i (1≤ti≤106

).

Each of the following n−1

lines describe the tree. For every i from 2 to n, the corresponding line contains two integers pi and li, where pi denotes the parent of vertex i and li denotes the time it takes Mitya to move the chip along the edge from vertex i to its parent (1≤pi<i, 0≤li≤109

).

Output

Output a single integer — maximum number of cookies Mitya can eat.

Examples

Input
5 26
1 5 1 7 7
1 3 2 2 2
1 1
1 1
2 0
2 0
Output
11
Input
3 179
2 2 1
6 6 6
1 3
2 3
Output
4

Note

In the first example test case, Mitya can start by moving the chip to vertex 2

. In this case no matter how Vasya plays, Mitya is able to eat at least 11

cookies. Below you can find the detailed description of the moves:

  1. Mitya moves chip to vertex 2
  • .
  • Vasya removes edge to vertex 4
  • .
  • Mitya moves chip to vertex 5
  • .
  • Since vertex 5
  • has no children, Vasya does not remove any edges.
  • Mitya stops the game and moves the chip towards the root, eating cookies along the way (7

in vertex 5, 3 in vertex 2, 1 in vertex 1

  1. ).

Mitya spend 1+0

time to go down, 0+1 to go up, 7⋅2 to eat 7 cookies in vertex 5, 3⋅3 to eat 3 cookies in vertex 2, 1⋅1 to eat 1 cookie in vertex 1. Total time is 1+0+0+1+7⋅2+3⋅3+1⋅1=26.

题意:给定带权树,每个节点有一些a[i]个吃的,每个需要时间t[i],现在让你找一条路线,可以吃到最多的吃的。

思路:对于当前路线1-u,减去路上花费的时间,剩下的时间T-time用来吃东西,我们肯定是按照时间t排序后从小到大吃,这里不嫩想到用二分+前缀和来做。

线段树可以很好的解决这个问题。 (参考了WXK的代码,非常的漂亮,orz

题目还有博弈的限制,其实就是除了1号节点找第二大即可。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
ll sum[maxn],num[maxn],Mx[maxn][],ans[maxn];int t[maxn],x[maxn];
int Laxt[maxn],Next[maxn],To[maxn],Len[maxn<<],cnt;
void add(int u,int v,int l){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=l;
}
void update(int Now,int L,int R,int pos,int val)
{
sum[Now]+=(ll)val*pos; num[Now]+=val;
if(L==R) return ;int Mid=(L+R)>>;
if(pos<=Mid) update(Now<<,L,Mid,pos,val);
else update(Now<<|,Mid+,R,pos,val);
}
ll query(int Now,int L,int R,ll T)
{
if(sum[Now]<=T) return num[Now];
if(L==R) return T/L;
int Mid=(L+R)>>;
if(sum[Now<<]<=T) return num[Now<<]+query(Now<<|,Mid+,R,T-sum[Now<<]);
return query(Now<<,L,Mid,T);
}
void dfs(int u,ll T)
{
if(T<=) return ;
update(,,,t[u],x[u]);
ans[u]=query(,,,T);
for(int i=Laxt[u];i;i=Next[i]){
dfs(To[i],T-Len[i]*);
ll z=ans[To[i]];
if(z>Mx[u][]) swap(z,Mx[u][]);
if(z>Mx[u][]) swap(z,Mx[u][]);
}
if(u!=) ans[u]=max(Mx[u][],ans[u]);
else ans[u]=max(Mx[u][],ans[u]);
update(,,,t[u],-x[u]);
}
int main()
{
int N,p,l; ll T;
scanf("%d%lld",&N,&T);
rep(i,,N) scanf("%d",&x[i]);
rep(i,,N) scanf("%d",&t[i]);
rep(i,,N){
scanf("%d%d",&p,&l);
add(p,i,l);
}
dfs(,T);
printf("%lld\n",ans[]);
return ;
}

CodeForces - 1099F:Cookies (线段树)的更多相关文章

  1. CodeForces 1099F - Cookies - [DFS+博弈+线段树]

    题目链接:https://codeforces.com/problemset/problem/1099/F Mitya and Vasya are playing an interesting gam ...

  2. Vasya and a Tree CodeForces - 1076E(线段树+dfs)

    I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...

  3. Codeforces 787D. Legacy 线段树建模+最短路

    D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  4. Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)

    Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...

  5. Sereja and Brackets CodeForces - 380C (线段树+分治思路)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  6. CodeForces 91B Queue (线段树,区间最值)

    http://codeforces.com/problemset/problem/91/B B. Queue time limit per test: 2 seconds memory limit p ...

  7. Codeforces 343D WaterTree - 线段树, DFS序

    Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...

  8. codeforces 787D - Legacy 线段树优化建图,最短路

    题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...

  9. Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)

    题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...

  10. Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)

    Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...

随机推荐

  1. AIX安装JDK1.7教程

    1.下载 下载链接(下载需要登录IBM账号):https://www.ibm.com/developerworks/java/jdk/aix/service.html#i1 由于jdk版本AIX操作系 ...

  2. EXCEL词典(xllex.dll)文件丢失或损坏解决方法

    EXCEL词典(xllex.dll)文件丢失或损坏解决方法     1● 问题   2● 解决 fail 3● 方法2   regsvr32 xllex.dll     4● 方法3 启动server ...

  3. oracle如何创建表的自增ID(通过触发器)

    Oracle中创建表的自增ID(通过触发器),序列的自增ID和触发器的自增ID的区别 1.新增数据(序列) --创建示例表 -- create table Student( stuId ) not n ...

  4. 方便好用的 Idea mybatis 插件 MyBatisCodeHelper

    优点: 1.mapper文件(即表对应的dao)与xml文件自由切换,方便代码评审: 2.自动代码生成功能提高开发效率,mysql数据库创建好表结构,写完 pojo(注意字段类型要统一用对象类型!), ...

  5. Ubuntu中的在文件中查找和替换命令

    分类: 9.Linux技巧2009-09-29 13:40 1429人阅读 评论(0) 收藏 举报 ubuntujdbc 1.查找 find /home/guo/bin -name /*.txt | ...

  6. re随机模块应用-生成验证码(无图片)

    方法一,通过choice方式生成验证码 此方法生成每次调用crate_code()会生成三个随机数,然后再三个随机数中选择一个,资源调用相对多些 import random def v_code(co ...

  7. flask项目结构(四)使用sqlalchemy和alembic

    简介 其实我不是啥正经人,错了,不是啥正经程序员,所能想到的估计也就码农一级吧,高级程序员,搞什么算法,什么人工智能,大数据计算…………离我还太遥远. 但是这并不妨碍我继续学习,继续写垃圾小程序. 反 ...

  8. 《Python》网络编程基础

    计算机网络的发展及基础网络概念 问题:网络到底是什么?计算机之间是如何通信的? 早期 : 联机 以太网 : 局域网与交换机 广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无 ...

  9. Cracking The Coding Interview 4.0_二叉树

    #include <iostream> #include <string> using namespace std; class tree { public: tree() { ...

  10. 2.18 C++类与static关键字

    参考:http://www.weixueyuan.net/view/6349.html 总结: 类中的成员变量或成员函数一旦与static关键字相结合,则该成员变量或成员函数就是属于类的,而不是再是属 ...