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\), ...
随机推荐
- html之块级标签h系列,div
两个名词含义: 块级标签:内容再少也会占满整行 内联标签:有多少内容点多少地方 注:块级标签和内联不签不是绝对的,可以通过CSS作任意转换 1.h1-h6 :块级标签 请仅仅把标题标签用作标题文本,如 ...
- js添加事件通用方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0
昨天修改了一个工具,编译后本机运行正常,但放到服务器上执行却不行,提示: message:GetOleDbSchemaTable requires an open and available Conn ...
- Rest风格WEB服务(Rest Style Web Service)的真相
http://blog.csdn.net/jia20003/article/details/8365585 Rest风格WEB服务(Rest Style Web Service)的真相 分类: J2E ...
- MySQL计算时间差
MySQL计算两个日期的时间差函数:TIMESTAMPDIFF 语法: TIMESTAMPDIFF(interval, datetime_expr1, datetime_expr2) interval ...
- Node.js 相关资料网站汇总
地址:https://cnodejs.org/ nodejs中文网:http://nodejs.cn/ nodejs中文网:http://www.nodejs.net/ 相关API地址:http:// ...
- transport tablespace将一个表空间下的数据移到另一个表空间
http://blog.csdn.net/macliukaijie/article/details/8308643 1.创建两个表空间 SQL> create tablespace test1 ...
- Team Foundation Server
概述 (通常记作“TFS”) 是一种为 Microsoft 产品提供 源代码管理. 数据收集. 报告和项目跟踪,而为协作 软件开发 的项目. 可作为独立的软件,或 Visual Studio Team ...
- eclipse常用插件安装
打开资源文件所在目录 EasyExplorer 下载:http://sourceforge.net/projects/easystruts/ 直接拷贝到%ECLIPSE_HOME%\plugins 或 ...
- Mysql讲解数据库并发控制知识
1.下载Mysql并安装,我喜欢不用安装的zip版,cd到bin目录下,先修改下mysql的密码. mysqladmin -u root -p password mysql ,第一次运行并修改mysq ...