HDU 5877 [dfs序][线段树][序]
/*
题意:
n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个。
思路:
1.很明显的子树的操作,应用dfs序。
2.比赛的时候傻逼了,一直在调划分树。实际上这题考虑序关系,加树状数组或者线段树就可以搞定了。
3.序关系:将权值按照从大到小的顺序排序进行查询,然后按照从小到大的顺序排序进行插入。
*/ #include<bits/stdc++.h>
#define N 100050
using namespace std;
int ednum;
struct edge{
int id;
edge *next;
};
edge edges[N];
edge *adj[N];
struct tr{
int s,e,num;
};
tr tree[N*];
void build(int s,int e,int k){
tr &tmp=tree[k];
tmp.s=s;tmp.e=e;tmp.num=;
if(s==e)return;
int mid=(s+e)>>;
build(s,mid,k<<);
build(mid+,e,k<<|);
}
int cha(int s,int e,int k){
tr &tmp=tree[k];
if(tmp.s==s&&tmp.e==e)return tmp.num;
int mid=(tmp.s+tmp.e)>>;
if(e<=mid)return cha(s,e,k<<);
else if(s>mid)return cha(s,e,k<<|);
else return cha(s,mid,k<<)+cha(mid+,e,k<<|);
}
void ins(int pos,int k){
tr &tmp=tree[k];
if(tmp.s==tmp.e){
tmp.num++;
return;
}
int mid=(tmp.s+tmp.e)>>;
if(pos<=mid)ins(pos,k<<);
else ins(pos,k<<|);
tmp.num=tree[k<<].num+tree[k<<|].num;
}
inline void addedge(int a,int b){
edge *tmp=&edges[ednum++];
tmp->id=b;
tmp->next=adj[a];
adj[a]=tmp;
}
struct st{
int id;
long long val;
};
bool cmp1(st a,st b){
return a.val<b.val;
}
bool cmp2(st a,st b){
return a.val>b.val;
}
st sol1[N],sol2[N];
long long jilu[N];
int from[N];
int id[N],siz[N];
int dfn;
void dfs(int pos){
id[pos]=dfn++;
siz[pos]=;
for(edge *it=adj[pos];it;it=it->next){
dfs(it->id);
siz[pos]+=siz[it->id];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(adj,NULL,sizeof(adj));
memset(from,,sizeof(from));
ednum=;
int n;
long long k;
scanf("%d%lld",&n,&k);
build(,n,);
for(int i=;i<=n;i++){
scanf("%lld",jilu+i);
sol1[i].id=i;
sol1[i].val=jilu[i];
sol2[i]=sol1[i];
}
sort(sol1+,sol1++n,cmp1);
sort(sol2+,sol2++n,cmp2);
for(int i=;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
addedge(a,b);
from[b]=a;
}
int st=;
while(from[st]){
st=from[st];
}
dfn=;
dfs(st);
int bf=;
long long ans=;
for(int i=;i<=n;i++){
while(bf<=n&&sol1[bf].val<=k/sol2[i].val){
ins(id[sol1[bf].id],);
bf++;
}
ans+=cha(id[sol2[i].id],id[sol2[i].id]+siz[sol2[i].id]-,);
ans-=cha(id[sol2[i].id],id[sol2[i].id],);
}
printf("%lld\n",ans);
}
}
HDU 5877 [dfs序][线段树][序]的更多相关文章
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- hdu 3974 dfs时间戳+线段树
题意: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务. 有若干操作,分配给员工任务以及查询该员工正在执行的任务. 题解: 典型的更新字树的操 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
- POJ 3321 DFS序+线段树
单点修改树中某个节点,查询子树的性质.DFS序 子树序列一定在父节点的DFS序列之内,所以可以用线段树维护. 1: /* 2: DFS序 +线段树 3: */ 4: 5: #include < ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
随机推荐
- win7 关于远程桌面登陆的方法,相应服务的启动
转自:http://blog.csdn.net/ningfuxuan/article/details/7519476 远程登陆电脑,对远程电脑的设置 (1)首先要启动远程电脑中的Remote Desk ...
- maven本地仓库
引入某一个站点的jar包 <repositories> <repository> <id>maven.seasar.org</id> <name& ...
- 并行计算之OpenMP入门简介
在上一篇文章中介绍了并行计算的基础概念,也顺便介绍了OpenMP. OpenMp提供了对于并行描述的高层抽象,降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现 ...
- 一个问题提交的实例(js原生动画,原生ajax,js引用加参数)
document.writeln("<div id=\"tanchuangwai\" class=\"tanchuangwai\" style= ...
- bzoj2289: 【POJ Challenge】圆,圆,圆
Description 1tthinking随便地画了一些圆. ftiasch认为这些圆有交集(面积非零)的可能性不大.因为他实在画了太多圆,所以你被请来判断是否存在交集. Input 第1行,一个整 ...
- Java-Thread
1. 线程的创建和启动 1.1 继承Thread 在run方法里,通过this获取当前线程. 多个线程不能共享实例变量. 1.2 通过实现接口 1.2.1 实现Runable接口 在run方法里,只能 ...
- MySQL运行出错:无法连接驱动、无root访问权限解决办法
按照疯狂java讲义的13.3的程序,发现程序运行出错. 1.点开runConnMySql.cmd运行文件,出现如下结果: 2.用Editplus进行编译运行,如下结果: 报错定位到程序第18行,而第 ...
- 五大Android布局方式浅析
Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...
- Bellman-Ford & SPFA 算法——求解单源点最短路径问题
Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...
- linux 定时器编程实例(完善中).....
最近在写linux 下的定时器编程实验,测试发现 usleep函数在 x86 架构下的定时还是比较准确的,在arm9下 就不太准了. 今天用linux 下的setitimer()函数进行了定时 器的测 ...