题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877

题意:给一棵树和各点的权值a,求点对(u,v)个数,满足:1.u是v的祖先,2.a(u)*a(v)<=k。

对于这棵树,我们先存好树的结构。再离散化,最后dfs的时候往线段树里插点,那对应idx的值就是1。然后二分找不大于k/a[v]的下标,线段树统计计数就行了。换儿子的时候记得抹去上一个兄弟。

 #include <bits/stdc++.h>
using namespace std; #define lrt rt << 1
#define rrt rt << 1 | 1
typedef long long LL;
const int maxn = ;
int n, rt;
int in[maxn];
LL k, ret, a[maxn];
vector<int> G[maxn];
LL h[maxn];
int hcnt;
LL sum[maxn<<]; inline int getid(LL x) {
return lower_bound(h, h+hcnt, x) - h + ;
} void pushUP(int rt) {
sum[rt] = sum[lrt] + sum[rrt];
} void build(int l, int r, int rt) {
sum[rt] = ;
if(l == r) return;
int mid = (l + r) >> ;
build(l, mid, lrt);
build(mid+, r, rrt);
pushUP(rt);
} void update(int l, int r, int rt, int pos, LL val) {
if(l == r) {
sum[rt] += val;
return;
}
int mid = (l + r) >> ;
if(pos <= mid) update(l, mid, lrt, pos, val);
else update(mid+, r, rrt, pos, val);
pushUP(rt);
} LL query(int L, int R, int l, int r, int rt) {
if(l >= L && R >= r) return sum[rt];
int mid = (l + r) >> ;
LL ret = ;
if(L <= mid) ret += query(L, R, l, mid, lrt);
if(mid < R) ret += query(L, R, mid+, r, rrt);
return ret;
} void dfs(int u) {
int uu = getid(a[u]);
int vv = getid(k/a[u]);
ret += query(, vv, , hcnt, );
update(, hcnt, , uu, );
for(int i = ; i < G[u].size(); i++) dfs(G[u][i]);
update(, hcnt, , uu, -);
} int main() {
//freopen("in", "r", stdin);
int T, u, v;
scanf("%d", &T);
while(T--) {
scanf("%d %I64d",&n,&k);
memset(in, , sizeof(in)); hcnt = ; ret = ;
for(int i = ; i <= n; i++) {
scanf("%I64d", &a[i]);
G[i].clear();
h[hcnt++] = a[i]; h[hcnt++] = k / a[i];
}
sort(h, h+hcnt); hcnt = unique(h, h+hcnt) - h;
build(, hcnt, );
for(int i = ; i < n-; i++) {
scanf("%d %d",&u,&v);
G[u].push_back(v);
in[v]++;
}
for(int i = ; i <= n; i++) if(!in[i]) dfs(i);
printf("%I64d\n", ret);
}
return ;
}

最新文章

  1. 《Walking the callstack(转载)》
  2. 夜深了,写了个JQuery的省市区三级级联效果
  3. springmvc之格式化要显示的小数或者日期。
  4. javaEE-----org.springframework.dao.InvalidDataAccessApiUsageException: Write operation
  5. Integrated Circuit Intro
  6. 闹钟类app构想
  7. [Everyday Mathematics]20150223
  8. 如何出色的研究 RGSS3 (三) 形式的调整的细节
  9. Oracle sql 中的字符(串)替换与转换[转载]
  10. ADODB——RecordSet对象
  11. 化工厂装箱员 洛谷 p2530
  12. C语言运行库翻译
  13. ROS教程5 使用串口
  14. firewalld
  15. poj1154 【DFS】
  16. UIKIT_EXTERN和define定义常量
  17. es数据迁移脚本(python)
  18. Weka训练模型的存取
  19. AndroidStudio3.0以上版本的坑
  20. linux 上传下载 以及SCP命令

热门文章

  1. android 学习随笔二十二(小结)
  2. ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问(转)
  3. 鸟哥的linux私房菜学习记录之档案与目录管理
  4. window7快捷键
  5. Word and MediaElement
  6. Intent 转向
  7. HDU 3652:B-number(数位DP)
  8. 【转】Linus:利用二级指针删除单向链表
  9. Unix下五种IO模型
  10. 使用selenium来完成的例子