【树状数组】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序建立树状数 ...
随机推荐
- Codeforces Round #350 (Div. 2) A
A. Holidays time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- c#中数据库字符串的连接几种方式
ADO.net 中数据库连接方式(微软提供) 微软提供了以下四种数据库连接方式:System.Data.OleDb.OleDbConnectionSystem.Data.SqlClient.SqlCo ...
- GTK+与MFC不完全对比
转载自:http://tech.ddvip.com/2007-11/119640973738229.html 1. 两者都是基于面向对象设计的.尽管MFC是用C++写的,而GTK+是用C写的,但思想都 ...
- ios上传图片显示方向错误问题
IOS 上传图片方向显示错误问题 问题描述 在使用苹果手机上传图片的时候,发现传完的图片显示出来方向是错误的,竖着的图片会变成横着显示(少部分安卓手机也存在这个问题) 产生原因 ios 相机加入了方向 ...
- 转:使用 Nginx Upload Module 实现上传文件功能
普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦.Nginx有一个Upload模块,可以非常简单的实现文件上传功能.此模块的原理是先把用户上传的文件保存到临时 ...
- jsp中的一些细节和注意要点。。。。。简记
一: <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en&quo ...
- Local Authentication Using Challenge Response with Yubikey for CentOS 7
Connect Yubikey ,then initialize YubiKey slot 2: ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt ...
- Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】
转自:http://blog.chinaunix.net/uid-29339876-id-4042245.html 利用V4L2读取UVC摄像头数据并保存成视频文件,主要参考http://linuxt ...
- HTTP===如何理解网关
首先举个例子: 假设你的名字叫小不点(很小),你住在一个大院子里,你的邻居有很多小伙伴,父母是你的网关.当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声他的名字,他听到了就会回应你,并且跑出来跟你 ...