题目链接 Weak Pair

题意十分明确, 就是求出符合题意的有序点对个数。

首先对ai离散,离散之后的结果用rk[i]表示,然后进行二分预处理得到f[i],其中f[i]的意义为:其他的点和i这个节点满足weakpair要求的权值最大名次(名次权值小的排在前面)。

然后就开始跑一遍DFS,树状数组维护一下答案,就好了。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)              for(int i(a); i <= (b); ++i)
#define dec(i, a, b) for(int i(a); i >= (b); --i)
#define for_edge(i,x) for(int i = H[x]; i; i = X[i]) #define LL long long const int N = 300000 + 10; struct Node{
LL num;
int id;
friend bool operator < (const Node &a, const Node &b){
return a.num < b.num;
}
} tree[N]; int E[N << 1], X[N << 1], H[N << 1];
LL a[N];
int T, et;
int n;
LL k;
int x, y;
LL rk[N], f[N];
LL now;
int l, r;
bool pa[N];
int root;
LL c[N];
LL ans;
bool v[N]; inline void addedge(int a, int b){
E[++et] = b, X[et] = H[a], H[a] = et;
} inline void add(LL x, LL val){
for (; x <= n; x += (x) & (-x))
c[x] += val;
} inline LL query(LL x){
LL ret(0);
for (; x; x -= (x) & (-x)) ret += c[x];
return ret;
} void dfs(int x){
add(rk[x], 1);
for_edge(i, x) if (!v[E[i]]) dfs(E[i]), v[E[i]] = true;
add(rk[x], -1);
ans += query(f[x]);
} int main(){ scanf("%d", &T);
while (T--){
et = 0;
scanf("%d%lld", &n, &k);
rep(i, 1, n) scanf("%lld", a + i);
memset(v, false, sizeof v);
memset(pa, true, sizeof pa);
memset(tree, 0, sizeof tree);
memset(H, 0, sizeof H);
rep(i, 1, n - 1){
scanf("%d%d", &x, &y);
addedge(x, y);
pa[y] = false;
} rep(i, 1, n){
tree[i].num = a[i];
tree[i].id = i;
} sort(tree + 1, tree + n + 1);
rk[tree[1].id] = 1;
rep(i, 2, n)
if (tree[i].num == tree[i - 1].num) rk[tree[i].id] = rk[tree[i - 1].id];
else rk[tree[i].id] = rk[tree[i - 1].id] + 1; rep(i, 1, n){
now = k / a[i];
l = 1; r = n;
if (tree[1].num > now) f[i] = 0;
else{
while (l + 1 < r){
int mid = (l + r) >> 1;
if (tree[mid].num <= now) l = mid;
else r = mid - 1;
} if (tree[r].num <= now) l = r;
f[i] = rk[tree[l].id];
} }
root = 0;
rep(i, 1, n) if (pa[i]){ root = i; break;}
memset(c, 0, sizeof c);
ans = 0;
v[root] = true;
dfs(root);
printf("%lld\n", ans); } return 0; }

HDU5877 Weak Pair的更多相关文章

  1. HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: weak pair的要求: 1.u是v的祖先(注意不一定是父亲) 2.val[u]*va ...

  2. 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  ...

  3. HDU 5877 Weak Pair(弱点对)

    HDU 5877 Weak Pair(弱点对) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Jav ...

  4. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  5. 2016大连网络赛 Weak Pair

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Prob ...

  6. hdu 5877 Weak Pair (Treap)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题面; Weak Pair Time Limit: 4000/2000 MS (Java/Other ...

  7. HDU - 5877 Weak Pair (dfs+树状数组)

    题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...

  8. HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Tota ...

  9. HDU 5877 Weak Pair (2016年大连网络赛 J dfs+反向思维)

    正难则反的思想还是不能灵活应用啊 题意:给你n个点,每个点有一个权值,接着是n-1有向条边形成一颗有根树,问你有多少对点的权值乘积小于等于给定的值k,其中这对点必须是孩子节点与祖先的关系 我们反向思考 ...

随机推荐

  1. ZOJ 3231 Apple Transportation 树DP

    一.前言 红书上面推荐的题目,在138页,提到了关键部分的题解,但是实际上他没提到的还有若干不太好实现的地方.尤其是在这道题是大家都拿网络流玩弄的大背景下,这个代码打不出来就相当的揪心了..最后在牛客 ...

  2. 有关js的一些小问题

    忘了从哪里找来抄下来的: js执行顺序问题 1.函数的声明和调用 “定义式”函数声明 function fn1() {......} "赋值式"函数声明 var f=functio ...

  3. java以正确的方式停止线程

    java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的. 大多数停止线程使用Thr ...

  4. vue2.x生命周期

    vue2.x生命周期 1. beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用. 2. created 实例已经创建 ...

  5. Careercup - Microsoft面试题 - 4639756264669184

    2014-05-12 06:42 题目链接 原题: Write your own regular expression parser for following condition: az*b can ...

  6. IOS开发学习笔记031-代码实现微博界面

    微博界面如下 1.准备资源文件 新建一个plist文件,添加条目,root类型是array,子类型是Dictionary 2.更改父类,实现代理方法 接下来得实现过程如上一篇文章,改变父类为UITab ...

  7. BugKu 杂项-这么多数据包

    前边的都是些无关紧要,只要有点网络的基础我想应该都能懂,往下看,一直到NO104,这是在干什么? 源ip138一直向目标ip159发送syn握手包,想要建立连接,其实就是端口扫描,原理就是,想和你某个 ...

  8. Spring boot 整合jsp、thymeleaf、freemarker

    1.创建spring boot 项目 2.pom文件配置如下: <dependencies> <dependency> <groupId>org.springfra ...

  9. Leetcode 502.IPO

    IPO 假设 LeetCode 即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完成最多 ...

  10. HDU3232 Crossing Rivers 数学期望问题

    Crossing Rivers                                                                                     ...