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\), ...
随机推荐
- python3图片裁剪+转换pdf+压缩
本地大量长图,要发送给别人,所以要对图片进行裁剪+转换pdf+压缩 import zipfile import os from concurrent.futures import ThreadPool ...
- MySql远程连接无法打开解决办法
1.改表法. 请使用mysql管理工具,如:SQLyog Enterprise 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑使用mysql管理工 ...
- SQL Server 2005 分区表创建实例
--创建一个分区函数(默认为左边界)CREATE PARTITION FUNCTION PARTFUNC1(INT)AS RANGEFOR VALUES(1000,2000,3000,4000,500 ...
- sql2008 将行转为字符串, 将字符串转为行 互转
--将行转为字符串 select stuff((select top 20 ','+ QQ from dl_QQ where uiid=1 order by tim desc for xml path ...
- C# winform 右下角弹出窗口结果
using System.Runtime.InteropServices; [DllImport("user32")] private static extern bool Ani ...
- 利用百度地图API,获取经纬度坐标
利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代 ...
- 遇到 Error creating the Web Proxy specified in the 'system.net/defaultProxy' configuration section的解决办法
用记事本编辑*.EXE.config,在“<system.net>”节点加入<defaultProxy> <proxy usesystemdefault="Fa ...
- 未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"解决方案
可以到http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede1 ...
- routeros的配置资料
http://blog.csdn.net/boliang319/article/details/41800261 http://blog.csdn.net/boliang319/article/det ...
- C#将字符串转换为整型的三种方法的总结
在C#中,要将一个字符串或浮点数转换为整数,基本上有三种方法: (1)使用强制类型转换:(int)浮点数 (2)使用Convert.ToInt32(string) (3)使用int.Parse(str ...