子树操作, dfs序即可.然后计算<=L就直接在可持久化线段树上查询

-------------------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
#define M(l, r) (((l) + (r)) >> 1)
 
const int maxn = 200009;
 
typedef long long ll;
 
inline ll readll() {
char c = getchar();
for(; !isdigit(c); c = getchar());
ll ans = 0;
for(; isdigit(c); c = getchar())
  ans = ans * 10 + c - '0';
return ans;
}
inline int readint() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ans = 0;
for(; isdigit(c); c = getchar())
  ans = ans * 10 + c - '0';
return ans;
}
 
struct HASH {
ll id[maxn];
int N;
HASH() {
N = 0;
}
void add(ll v) {
id[N++] = v;
}
void work() {
sort(id, id + N);
N = unique(id, id + N) - id;
id[N] = 0x7fffffffffffffff;
}
int hash(ll v) {
return lower_bound(id, id + N, v) - id;
}
int _hash(ll v) {
return upper_bound(id, id + N, v) - id;
}
} h;
 
struct Node {
Node *l, *r;
int s;
} pool[maxn * 20], *pt = pool, *null, *root[maxn];
 
void set_null() {
null = pt++;
null->l = null->r = null;
null->s = 0;
}
 
int p;
Node* modify(Node* t, int l, int r) {
Node* h = pt++;
h->s = t->s + 1;
if(r > l) {
int m = M(l, r);
if(p <= m) {
h->l = modify(t->l, l, m);
h->r = t->r;
} else {
h->l = t->l;
h->r = modify(t->r, m + 1, r);
}
}
return h;
}
 
int query(int __l, int __r, int v) {
Node *_l = __l ? root[__l - 1] : null, *_r = root[__r];
int L = 1, R = h.N, ans = 0;
while(L < R) {
int m = M(L, R);
if(R <= v) {
ans +=_r->s - _l->s;
break;
}
if(m <= v) {
ans += _r->l->s - _l->l->s;
_l = _l->r; _r = _r->r; L = m + 1;
} else {
_l = _l->l; _r = _r->l; R = m;
}
}
return ans;
}
 
struct edge {
int to;
ll dist;
edge(int _t, ll _d):to(_t), dist(_d) {}
};
 
ll seq[maxn], L;
int _L[maxn], _R[maxn], cur = -1, N;
vector<edge> G[maxn];
 
void dfs(int x, ll d, int fa) {
seq[_L[x] = ++cur] = d;
for(vector<edge>::iterator e = G[x].begin(); e != G[x].end(); e++)
   if(e->to != fa) dfs(e->to, d + e->dist, x);
_R[x] = cur;
}
 
void init() {
N = readint(); L = readll();
for(int i = 1; i < N; i++) {
int p = readint() - 1; ll d = readll();
G[p].push_back(edge(i, d));
G[i].push_back(edge(p, d));
}
set_null();
}
 
void work() {
dfs(0, 0, -1);
for(int i = 0; i < N; i++)
   h.add(seq[i]);
h.work();
Node* fa = null;
for(int i = 0; i < N; i++) {
   p = h.hash(seq[i]) + 1;
   fa = root[i] = modify(fa, 1, h.N);
}
    for(int i = 0; i < N; i++)
printf("%d\n", query(_L[i], _R[i], h._hash(L + seq[_L[i]])));
}
 
int main() {
init();
work();
return 0;
}

-------------------------------------------------------------------

3011: [Usaco2012 Dec]Running Away From the Barn

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 136  Solved: 74
[Submit][Status][Discuss]

Description

It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to round them all up, and needs your help in the search. FJ's farm is a series of N (1 <= N <= 200,000) pastures numbered 1...N connected by N - 1 bidirectional paths. The barn is located at pasture 1, and it is possible to reach any pasture from the barn. FJ's cows were in their pastures this morning, but who knows where they ran to by now. FJ does know that the cows only run away from the barn, and they are too lazy to run a distance of more than L. For every pasture, FJ wants to know how many different pastures cows starting in that pasture could have ended up in. Note: 64-bit integers (int64 in Pascal, long long in C/C++ and long in Java) are needed to store the distance values.

给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于l的点有多少个。

Input

* Line 1: 2 integers, N and L (1 <= N <= 200,000, 1 <= L <= 10^18)

* Lines 2..N: The ith line contains two integers p_i and l_i. p_i (1 <= p_i < i) is the first pasture on the shortest path between pasture i and the barn, and l_i (1 <= l_i <= 10^12) is the length of that path.

Output

* Lines 1..N: One number per line, the number on line i is the number pastures that can be reached from pasture i by taking roads that lead strictly farther away from the barn (pasture 1) whose total length does not exceed L.

Sample Input

4 5
1 4
2 3
1 5

Sample Output

3
2
1
1
OUTPUT DETAILS: Cows from pasture 1 can hide at pastures 1, 2, and 4. Cows from pasture 2 can hide at pastures 2 and 3. Pasture 3 and 4 are as far from the barn as possible, and the cows can hide there.

HINT

Source

BZOJ 3011: [Usaco2012 Dec]Running Away From the Barn( dfs序 + 主席树 )的更多相关文章

  1. BZOJ_3011_[Usaco2012 Dec]Running Away From the Barn _可并堆

    BZOJ_3011_[Usaco2012 Dec]Running Away From the Barn _可并堆 Description 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于l的 ...

  2. 【BZOJ3011】[Usaco2012 Dec]Running Away From the Barn 可并堆

    [BZOJ3011][Usaco2012 Dec]Running Away From the Barn Description It's milking time at Farmer John's f ...

  3. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  4. BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)

    题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...

  5. [BZOJ3011][Usaco2012 Dec]Running Away From the Barn

    题意 给出一棵以1为根节点树,求每个节点的子树中到该节点距离<=l的节点的个数 题解 方法1:倍增+差分数组 首先可以很容易的转化问题,考虑每个节点对哪些节点有贡献 即每次对于一个节点,找到其第 ...

  6. bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3011 题解 复习一下左偏树板子. 看完题目就知道是左偏树了. 结果这个板子还调了好久. 大概已 ...

  7. [Usaco2012 Dec]Running Away From the Barn

    题目描述 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 输入格式 Line 1: 2 integers, N and L (1 <= N <= 200,0 ...

  8. bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

  9. BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )

    把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...

随机推荐

  1. linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)

    一.描写叙述 眼下已经linux64位系统中g++4.4.7下发现了该bug.其它的版本号还未測试. 经測试,假设传入wcsncpy函数第一个參数(即目标缓冲区)的地址不能被4整除的话就必然会发生段错 ...

  2. Spark调研笔记第2篇 - 怎样通过Sparkclient向Spark提交任务

    在上篇笔记的基础上,本文介绍Sparkclient的基本配置及Spark任务提交方式. 1. Sparkclient及基本配置 从Spark官网下载的pre-built包中集成了Sparkclient ...

  3. Android学习之Drawable(一)

    Drawable有很多种,它们表示一种图像概念,但它们不全是图片.Drawable是什么呢?下面是Google Android API中的定义: A Drawable is a general abs ...

  4. guava中eventbus注解使用

    guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈 ...

  5. Introduction to REST #Reprinted#

    from http://www.cnblogs.com/shanyou/archive/2012/05/12/2496959.html dudu的 HttpClient + ASP.NET Web A ...

  6. ASP.NET jQuery 随笔 在TextBox里面阻止复制、剪切和粘贴事件

    当用户要输入一些密码.信用卡信息和银行账号等敏感信息,用户更希望手工通过键盘敲入数据,而好过通过剪贴板复制粘贴. 我们先来看下实现后的效果: <%@ Page Language="C# ...

  7. dzz使用总结(添加云盘,好用的Web文件管理器,网络播放器)

    dzz添加云盘: http://www.lebook.me/book/22822#fid_3990471 呆萌http://pan.diemoe.net/s/GcdFI4 网络播放器 mediaele ...

  8. hibernate 单元测试 5.2

     单元测试 测试 dao service action package com.kaishengit.test; import org.hibernate.Session; import com.ka ...

  9. 编程的毛病——C++之父访谈

    原文见:http://www.technologyreview.com/InfoTech/17831/  翻译:xeon 11/29/2006 在20世纪的80年代和90年代,Bjarne Strou ...

  10. utf8字节

    <pre name="code" class="html">[root@wx03 0724]# perl a1.pl 112 [root@wx03 ...