题意就是对每个点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. 解决IIS设置多个工作进程中Session失效的问题

    利用StateServer实现Session共享 session保存在专门的StateServer中,该种方式,性能损失比sql略好.比inproc据说有10%-15%的性能损失.怎么使用StateS ...

  2. Backup and Restore MySQL Database using mysqlhotcopy

    mysqlhotcopy is a perl script that comes with MySQL installation. This locks the table, flush the ta ...

  3. android studio的弹出层

    <activity android:name=".SecondActivity" android:theme="@style/Theme.AppCompat.Dia ...

  4. spring 中的@Import注解和@ImportResource注解

    概述:@Import注解是引入带有@Configuration的java类. @ImportResource是引入spring配置文件.xml 案例的核心代码如下: package com.timo. ...

  5. AWS文档与用户指南

    AWS Command Line Interface http://docs.amazonaws.cn/cli/latest/userguide/cli-chap-welcome.html VM Im ...

  6. jquery学习之add()

    解读: add() 将元素添加到匹配元素的集合中 例1: <!DOCTYPE html> <html> <head> <style> div { wid ...

  7. iOS 之持久化存储 plist、NSUserDefaults、NSKeyedArchiver、数据库

    1.什么是持久化? 本人找了好多文章都没有找到满意的答案,最后是从孙卫琴写的<精通Hibernate:Java对象持久化技术详解>中,看到如下的解释,感觉还是比较完整的.摘抄如下: 狭义的 ...

  8. ORACLE中根据生日得到年龄

    create or replace function F_GETAGE(dateofbirth date) return varchar2 is begin ) then ); else ) then ...

  9. JVM内存模型 二

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  10. bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版

    这道题写法和之前差不多 但是fhqtreap在加点的时候为了同时维护大根堆以及二叉排序树的性质所以插入时也要注意分裂 fhqteap需要判断指针是否为空 不然就会re 这个我调了很久 #include ...