【树状数组】Gym - 101147J - Whistle's New Car
题意就是对每个点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的更多相关文章
- Codeforces Gym 100114 H. Milestones 离线树状数组
H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...
- Gym 101908C - Pizza Cutter - [树状数组]
题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...
- Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp
Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...
- Gym 100960G (set+树状数组)
Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...
- Gym - 101755G Underpalindromity (树状数组)
Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...
- Gym - 100269F Flight Boarding Optimization(dp+树状数组)
原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...
- 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels
题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ...
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...
- gym 100589A queries on the Tree 树状数组 + 分块
题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...
随机推荐
- 树形DP小结
树形DP1.简介:树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果.tips:树的遍历 ...
- Java中Class<T>与Class<?>的区别
E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定 ...
- powershell for rename server name
Rename server name if server has not yet joined AD $Hostname = "newname" $username = " ...
- Sed basic and practice
定义:Sed 是针对数据流的非交谈式编辑器,它在命令行下输入编辑命令并指定文件,然后可以在屏幕上看到编辑命令的输出结果. 好处:Sed 在缓冲区内默认逐行处理数据,所以源文件不会被更改和破坏. 格式: ...
- npm获取配置值的两种方式
命令行标记 在命令行上放置--foo bar设置foo配置参数为bar. 一个 -- 参数(argument)告诉cli解析器停止读取flags.一个 在命令行结尾的--flag参数(paramete ...
- 转:Mybatis系列之集合映射
转:Mybatis系列之集合映射 上篇文章我们讲了关联映射,实现了销售与登录用户之间的关联.本文我们接着来讲一讲集合映射,实现销售与客户的多对多关系. 实现销售与客户多对多关系 本文中仍延用<M ...
- 最短路径算法 SP
dijkstra求最短路径长度 dijkstra求最短路并记录路径 #include<stdio.h> #include<string.h> #include<stack ...
- 数据结构&图论:K短路-可持久化可并堆
本来A*就可以搞定的题,为了怕以后卡复杂度,找了个这么个方法 现阶段水平不够就不补充算法分析部分了 对于图G,建立一个以终点t为起点的最短路径构成的最短路径树 (就是反着跑一遍最短路,然后对于一个不为 ...
- codefoeces problem 671D——贪心+启发式合并+平衡树
D. Roads in Yusland Mayor of Yusland just won the lottery and decided to spent money on something go ...
- ACdream 1113 The Arrow (概率dp求期望)
E - The Arrow Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit ...