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.则 ...
随机推荐
- 认识CLR [《CLR via C#》读书笔记]
认识CLR [<CLR via C#>读书笔记] <CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runti ...
- redis 中文存储乱码问题
在redis 中存储中文,读取会出现乱码(其实不是乱码,只是不是我们存的中文显示) redis> set test "我们" OK redis> get test &q ...
- 自由的Debian
原文:http://www.debian.org/intro/free 许多人在刚开始接触自由软件时都会很困惑,原因是自由软件中的自由一词并不是他们所期望的那样.对他们而言自由意味着免费.一本英文字典 ...
- C# 代理应用 - Cachable
C# 代理应用 - Cachable 放心,这次不是说设计模式中的代理模式,说的是C#的RealProxy的用法,主要用于:通过给class贴标签,让class做更多的工作,比如判断是否存在缓存,有则 ...
- Android与js交互实例
Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML) ...
- 用Vue中遇到的问题和处理方法(一)
用Vue开发项目有一段时间,在实际项目中遇到一些问题,在里把问题记录下来,并附上解决方案,给遇到同样的问题的码友提供一个解决思路吧: 测试部抛出问题一:在Vue1.0路由vue-router中,当点击 ...
- Semaphore初探
示例一: package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService; import java.util ...
- Curator Recipes(Cache&Counter)
Cache 路径缓存(Path Cache) 监视一个ZNode,当子节点增加.更新.删除改变状态时,路径缓存会在本地保存当前子节点及其数据和状态. public PathChildrenCache( ...
- android 轮播图
轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考 目前测试图片为mipmap中的图片 没有写从网络加载 ...
- Float 的那些事
css float 定义元素浮动到左侧或者右侧.其出现的本意是让文字环绕图片而已. left.right.inherit(从父级元素获取float值).none 一.浮动的性质 1. 包裹性 disp ...