子树操作, 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. 各浏览器对 window.open() 的窗口特征 sFeatures 参数支持程度存在差异

    标准参考 无. 问题描述 使用 window.open 方法可以弹出一个新窗口,其中 open 方法的 sFeatures 参数选项在各浏览器中支持程度不一,这有可能导致同样的代码使各浏览器中弹出窗口 ...

  2. 转换DataSet中的多个表为Excel中的多个Sheets

    第一种方法: 1. 在设计页面,有一个button按钮,当用户单击按钮的时候,发生转换 <asp:Button ID="Export" runat="server& ...

  3. 融合python2和python3

    很多情况下你可能会想要开发一个程序能同时在python2和python3中运行. 想象一下你开发了一个模块,成百上千的人都在使用它,但不是所有的用户都同时使用python 2和3.这种情况下你有两个选 ...

  4. apache基本配置

    apache基本配置               apache本地虚拟域名配置  

  5. Python学习之路——字符处理(一)

    一.整数: 例如:1.10.30 整数可以做以下操作: bit_length函数:返回该整数占用的最少位数: >>> x=100 >>> x.bit_length( ...

  6. (Problem 37)Truncatable primes

    The number 3797 has an interesting property. Being prime itself, it is possible to continuously remo ...

  7. Java chapter04-1

    public class CPU { int speed; //获得speed的值 public void setSpeed(int m){ speed = m; } //返回speed的值 publ ...

  8. CodeForces - 27E--Number With The Given Amount Of Divisors(反素数)

    CodeForces - 27E Number With The Given Amount Of Divisors Submit Status Description Given the number ...

  9. LibSVM笔记系列(3)——初学移植libsvm的C/C++版本

    在LibSVM笔记系列(1)中已经提到在g++环境中编译LibSVM只需要一个make命令那样简单. 本文将介绍 (1)LibSVM的编译文件结构 (2)svm.h中重要数据结构及函数分析 (3)sv ...

  10. Codeforces Round #198 (Div. 2) B. Maximal Area Quadrilateral

    B. Maximal Area Quadrilateral time limit per test 1 second memory limit per test 256 megabytes input ...