题意就是对每个点i,统计在其子树内(不含自身),且depj-depi<=xj的点有多少个。

把点分别按照dep-x和dep进行排序,离线处理,

每次把dep-x小于等于当前dep值的点插入树状数组,就变成了询问dfs序在一个区间内的点有多少个,可以用树状数组轻松解决。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f,C;
void R(int &x){
C=0;f=1;
for(;C<'0'||C>'9';C=getchar())if(C=='-')f=-1;
for(x=0;C>='0'&&C<='9';C=getchar())(x*=10)+=(C-'0');
x*=f;
}
typedef long long ll;
#define N 500010
int T,n,a[N];
int v[N<<1],next[N<<1],w[N<<1],first[N],e;
void AddEdge(int U,int V,int W)
{
v[++e]=V;
w[e]=W;
next[e]=first[U];
first[U]=e;
}
ll dep[N];
int Ls[N],Rs[N],tot;
bool vis[N];
void dfs(int U)
{
vis[U]=1;
Ls[U]=++tot;
for(int i=first[U];i;i=next[i])
if(!vis[v[i]])
{
dep[v[i]]=dep[U]+(ll)w[i];
dfs(v[i]);
}
Rs[U]=tot;
}
//struct Point
//{
// ll v;
// int p;
//}t[N<<1];
//bool cmp(const Point &a,const Point &b)
//{
// return a.v<b.v;
//}
struct Poin2
{
ll v;
int p;
}all[N<<1];
bool cm2(const Poin2 &a,const Poin2 &b)
{
return a.v<b.v;
}
int anss[N];
int d[N];
void update(int p){for(;p<=n;p+=(p&(-p))) ++d[p];}
int query(int p){int res=0; for(;p;p-=(p&(-p))) res+=d[p]; return res;}
int main()
{
freopen("car.in","r",stdin);
// freopen("car.out","w",stdout);
int x,y,z;
R(T);
for(;T;--T)
{
e=tot=0;
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
memset(next,0,sizeof(next));
memset(first,0,sizeof(first));
memset(vis,0,sizeof(vis));
memset(dep,0,sizeof(dep));
memset(d,0,sizeof(d));
R(n);
for(int i=1;i<=n;++i)
R(a[i]);
for(int i=1;i<n;++i)
{
R(x); R(y); R(z);
AddEdge(x,y,z);
AddEdge(y,x,z);
}
dfs(1);
// for(int i=1;i<=n;++i)
// {
// t[i].v=dep[i]-(ll)a[i];
// t[i].p=i;
// }
// for(int i=n+1;i<=n*2;++i)
// {
// t[i].v=dep[i-n];
// t[i].p=i;
// }
// sort(t+1,t+n*2+1,cmp);
// int zy=1;
// all[t[1].p].v=zy;
// all[t[1].p].p=(t[1].p>n ? t[1].p-n : t[1].p);
// for(int i=2;i<=n*2;++i)
// {
// if(t[i].v!=t[i-1].v)
// ++zy;
// all[t[i].p].v=zy;
// all[t[i].p].p=(t[i].p>n ? t[i].p-n : t[i].p);
// }
for(int i=1;i<=n;++i)
{
all[i].v=dep[i]-(ll)a[i];
all[i].p=i;
}
for(int i=n+1;i<=n*2;++i)
{
all[i].v=dep[i-n];
all[i].p=i-n;
}
sort(all+1,all+n+1,cm2);
sort(all+n+1,all+n*2+1,cm2);
int j=1;
for(int i=n+1;i<=n*2;++i)
{
while(all[j].v<=all[i].v && j<=n)
{
update(Ls[all[j].p]);
++j;
}
anss[all[i].p]=query(Rs[all[i].p])-query(Ls[all[i].p]);
}
for(int i=1;i<n;++i)
printf("%d ",anss[i]);
printf("%d\n",anss[n]);
}
return 0;
}

【树状数组】Gym - 101147J - Whistle's New Car的更多相关文章

  1. Codeforces Gym 100114 H. Milestones 离线树状数组

    H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...

  2. Gym 101908C - Pizza Cutter - [树状数组]

    题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...

  3. Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp

    Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...

  4. Gym 100960G (set+树状数组)

    Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...

  5. Gym - 101755G Underpalindromity (树状数组)

    Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...

  6. Gym - 100269F Flight Boarding Optimization(dp+树状数组)

    原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...

  7. 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels

    题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ...

  8. Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)

    题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...

  9. gym 100589A queries on the Tree 树状数组 + 分块

    题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...

随机推荐

  1. HDU 1203 01背包

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. python爬取七星彩的开奖历史记录

    1.因为人不可能一直无休止的学习,偶尔也想做点儿别的,昨天无聊就想写写Python,当然我承认我上班后基本都是在学工作方面的事情,在这个岗位我也呆了三年多了,还是那句话问我什么会不会我会给你说我啥都会 ...

  3. 播放video

    <html> <head> <title> four in one vedio</title> <style type="text/cs ...

  4. AngularJs学习——模拟用户登录的简单操作

    效果截图:

  5. js点亮星星评分并获取参数的js代码

    点亮星星评分后,点击按钮,立即获得分数参数值,方便不想使用ajax传参的朋友 http://demo.jb51.net/js/2014/jsxxdf/demo2.html <!DOCTYPE h ...

  6. JS高级技巧(简洁版)

    高级函数 由于在JS中,所有的函数都是对象,所以使用函数指针十分简单,也是这些东西使JS函数有趣且强大 安全的类型检测 JS内置的类型检测机制并不是完全可靠的 typeof 操作符返回一个字符串,表示 ...

  7. 使用APICloud打包webapp

    做个记录: 参照apicloud官方文档:http://docs.apicloud.com/Dev-Tools/sublime-apicloud-plugin 可以看下我的github:https:/ ...

  8. Educational Codeforces Round 41 A B C D E

    A. Tetris 题意 俄罗斯方块,问能得多少分. 思路 即求最小值 Code #include <bits/stdc++.h> #define F(i, a, b) for (int ...

  9. 【Sqlite3】SQLITE3使用总结(转)

    原文转自 https://www.cnblogs.com/wenxp2006/archive/2012/06/04/2535169.html SQL语句操作 介绍如何用sqlite 执行标准 sql  ...

  10. python函数对象和闭包

    关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看 ...