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\), ...
随机推荐
- 通过改变计算机策略来解决“只能通过Chrome网上应用商店安装该程序”的方法及模版文件下载
通过改变计算机策略来解决“只能通过Chrome网上应用商店安装该程序”的方法及模版文件下载 操作步骤 1.开始 -> 运行 -> 输入gpedit.msc -> 回车确定打开计算机本 ...
- [linux]BASH 的基本语法
最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1 最简单的例子 -- ...
- bootstrapDialog插件集成datatables插件遇到的异常
最近项目中,涉及到很多细分领域的东西,有好些目前还没有详细的方案.这是后话,当前起步阶段,我要把握技术路线,搭建基础架构!其中,有好几个地方都用到模态框(Modal), 虽然Bootstrap框架里面 ...
- PHP使用1个crontab管理多个crontab任务
http://www.binarytides.com/php-manage-multiple-cronjobs-with-a-single-crontab-entry/ In many php app ...
- 查看.Net Framework版本的方法
乐博网最新补充(乐博网一步步教你如何最快查看本机.net framework的版本): 方法一: 第一步: 打开“我的电脑“,在地址栏输入 %systemroot%\Microsoft.NET\Fr ...
- [Hibernate] - Fetching strategies
Hibernate中的抓取策略,参考文档: http://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/performance.html ...
- 解决方案:将已存在的项目 添加到 tfs解决方案中的时候 出现:新项目不能成功加入源码控制
遇到此问题 可能是因为你的 解决方案文件 没有正确与 tfs服务器绑定导致的 解决方式是: 在打开任意一个源码文件的时候,打开 vs2013的 文件>> Go to File->So ...
- bzoj3035: 导弹防御塔
Description Freda的城堡——“Freda,城堡外发现了一些入侵者!”“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”“可是入侵者已经接近城堡了呀!”“别担心,rain ...
- Windows2008 Patching(打补丁)
我们都知道Windows的服务器都需要打补丁的,要不然漏洞那个叫多啊.Windows的系列服务器打补丁无非就是两种方法: 1. 通过Internet打补丁: Go to control Panel-& ...
- jquery.cookie.js存与取以及过期时间设置
$(function(){ $(".active_out .abtn").click(function(){ $(this).parents(".active_out&q ...