HDU 5877 Weak Pair
$dfs$序,线段树。
可以统计每一个节点作为$root$的子树上对答案的贡献,可以将树转换成序列。问题就变成了一段区间上求小于等于某个值的数有几个。用线段树记录排好序之后的区间序列,询问的时候,属于询问区间的每个节点二分一下统计答案即可。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*+c-''; c=getchar();}
} const int maxn=;
int T,n,h[maxn],sz,r[maxn],root;
LL k,v[maxn];
struct Edge { int u,v,nx; }e[maxn];
LL a[*maxn],L[*maxn],R[*maxn];
vector<int>s[*maxn]; void add(int u,int v)
{
e[sz].u=u; e[sz].v=v;
e[sz].nx=h[u]; h[u]=sz++;
} void dfs(int x)
{
sz++; a[sz]=v[x]; L[x]=sz;
for(int i=h[x];i!=-;i=e[i].nx) dfs(e[i].v);
sz++; a[sz]=v[x]; R[x]=sz;
} void build(int l,int r,int rt)
{
if(l==r) { s[rt].push_back(a[l]); return; }
int m=(l+r)/; build(l,m,*rt); build(m+,r,*rt+); int sum=,p1=,p2=;
while(sum<r-l+)
{
if(p1<s[*rt].size()&&p2<s[*rt+].size())
{
if(s[*rt][p1]<s[*rt+][p2]) s[rt].push_back(s[*rt][p1]), p1++;
else s[rt].push_back(s[*rt+][p2]), p2++;
}
else if(p1<s[*rt].size()) s[rt].push_back(s[*rt][p1]), p1++;
else s[rt].push_back(s[*rt+][p2]), p2++;
sum++;
}
} int get(int L,int R,LL num,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
int left=,right=r-l,pos=-; while(left<=right)
{
int mid=(left+right)/;
if((LL)s[rt][mid]>num) right=mid-;
else left=mid+,pos=mid;
} return pos+;
} int m=(l+r)/,x1=,x2=;
if(L<=m) x1=get(L,R,num,l,m,*rt);
if(R>m) x2=get(L,R,num,m+,r,*rt+);
return x1+x2;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%lld",&n,&k);
for(int i=;i<=n;i++) scanf("%lld",&v[i]); memset(h,-,sizeof h);
memset(r,sz=,sizeof r);
for(int i=;i<*maxn;i++) s[i].clear(); for(int i=;i<=n-;i++)
{
int u,v; scanf("%d%d",&u,&v);
add(u,v); r[v]++;
} for(int i=;i<=n;i++) if(r[i]==) root=i;
sz=; dfs(root); build(,*n,); LL Ans=;
for(int i=;i<=n;i++)
{
if(L[i]+==R[i]) continue;
if(v[i]==) { Ans=Ans+(R[i]-L[i]-); continue; }
Ans=Ans+get(L[i]+,R[i]-,k/v[i],,*n,);
}
printf("%lld\n",Ans/);
}
return ;
}
HDU 5877 Weak Pair的更多相关文章
- HDU 5877 Weak Pair(弱点对)
HDU 5877 Weak Pair(弱点对) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Jav ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- hdu 5877 Weak Pair (Treap)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题面; Weak Pair Time Limit: 4000/2000 MS (Java/Other ...
- 2016 ACM/ICPC Asia Regional Dalian Online HDU 5877 Weak Pair treap + dfs序
Weak Pair Problem Description You are given a rooted tree of N nodes, labeled from 1 to N. To the ...
- HDU - 5877 Weak Pair (dfs+树状数组)
题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...
- HDU 5877 Weak Pair (2016年大连网络赛 J dfs+反向思维)
正难则反的思想还是不能灵活应用啊 题意:给你n个点,每个点有一个权值,接着是n-1有向条边形成一颗有根树,问你有多少对点的权值乘积小于等于给定的值k,其中这对点必须是孩子节点与祖先的关系 我们反向思考 ...
- hdu 5877 Weak Pair dfs序+树状数组+离散化
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Prob ...
- HDU 5877 Weak Pair(树状数组)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5877 [题目大意] 给出一棵带权有根树,询问有几对存在祖先关系的点对满足权值相乘小于等于k. [题 ...
- HDU 5877 Weak Pair(树状数组+dfs+离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: 给出一棵树,每个顶点都有权值,现在要你找出满足要求的点对(u,v)数,u是v的祖先并且a[u]*a ...
- HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化
http://acm.hdu.edu.cn/listproblem.php?vol=49 给定一颗树,然后对于每一个节点,找到它的任何一个祖先u,如果num[u] * num[v] <= k.则 ...
随机推荐
- HashTable
算法打基础——HashTable 这一节主要讲很多方面非常重要的hash table等问题. 由于平时很少用到这些,基本都忘了... 怎样快速的在内存中插入.删除.和搜索呢? 这就需要哈希表了 这一节 ...
- (翻译) Android Accounts Api使用指南
本文翻译自Udinic的文章Write your own Android Authenticator,可能需要FQ才能阅读.这是译者目前能找到的介绍如何使用Android的Accounts Api最好 ...
- Memcache Slab Eviction 功能测试
Memcache Slab Eviction 功能测试 1 功能简述 1.1 Automove功能背景 由于memcache的内存分配是基于slab的,每个1M的page内只能存放对应slab大小范围 ...
- Java 快速开发平台 WB 6.8 发布
WebBuilder是一款开源的可视化Web应用开发和运行平台. 基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发: 高效.稳定和可扩展的特点,适合复杂企业 ...
- Go语言Web框架gwk介绍4
Go语言Web框架gwk介绍 (四) 事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...
- WP8开发札记(二)让程序支持锁屏运行
我们都知道WP8是采用墓碑机制来管理应用程序的. 当我们把手机锁屏了,默认情况下,App就触发了deactivated 事件,准备被墓碑化了. 但是,有些时间我们不想让程序就此终止运行.(比如说,你开 ...
- IP选路
IP选路 1.概述 路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类 从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. ...
- 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源) 先直接上程序界面,了解整体工作流程是什么样子的,求服务器进行挂机测试,需要固定IP,空间大概需要10G左右(主要是BT种子占用空间 ...
- 使用easy_install进行模块/包管理
使用easy_install进行模块/包管理 今天在阅读以前项目代码时,发现里面使用的第三方模块的参数相当诡异,总是对不上.经过分析之后,发现是自己安装的第三方模块跟项目使用的版本不一致.在Pytho ...
- spring事务管理器设计思想(2)
spring事务管理器设计思想(二) 上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当 ...