1 //树形DP+树状数组 HDU 5877  Weak Pair
 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值
 3 // 这道题要离散化
 4
 5 #include <bits/stdc++.h>
 6 using namespace std;
 7 #define LL long long
 8 typedef pair<int,int> pii;
 9 const double inf = 123456789012345.0;
10 const LL MOD =100000000LL;
11 const int N = 2e5+10;
12 const int maxx = 200010;
13 #define clc(a,b) memset(a,b,sizeof(a))
14 const double eps = 1e-7;
15 void fre() {freopen("in.txt","r",stdin);}
16 void freout() {freopen("out.txt","w",stdout);}
17 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
18
19 map<LL,LL> ma;
20 LL a[N];
21 LL c[N],b[N];
22 LL in[N];
23 vector<LL> g[N];
24 LL lowbit(LL x){ return x&(-x);}
25 LL add(LL x,int t){
26     while(x>0){
27        c[x]+=t;
28        x-=lowbit(x);
29     }
30 }
31 LL Sum(LL x){
32     LL sum=0;
33     while(x<maxx){
34         sum+=c[x];
35         x+=lowbit(x);
36     }
37     return sum;
38 }
39
40 LL ans=0;
41 LL n,k;
42 void dfs(LL rt){
43      for(LL i=0;i<(int)g[rt].size();i++){
44          LL v=g[rt][i];
45          ans+=Sum(ma[a[v]]);
46          if(a[v]==0) add(maxx,1);
47          else add(ma[k/a[v]],1);
48          dfs(v);
49          if(a[v]==0) add(maxx,-1);
50          else add(ma[k/a[v]],-1);
51      }
52 }
53 int main(){
54     int T;
55     scanf("%d",&T);
56     while(T--){
57         ma.clear();
58         memset(c,0,sizeof(c));
59         scanf("%I64d%I64d",&n,&k);
60         for(int i=1;i<=n;i++){
61             scanf("%I64d",&a[i]);
62             b[i*2-2]=a[i];
63             if(a[i]!=0) b[i*2-1]=k/a[i];
64             g[i].clear();
65             in[i]=0;
66         }
67         sort(b,b+2*n);
68         int K=unique(b,b+2*n)-b;
69         int cxt=0;
70         for(int i=0;i<K;i++){
71             ma[b[i]]=++cxt;
72         }
73         for(LL i=0;i<n-1;i++){
74             LL u,v;
75             scanf("%I64d%I64d",&u,&v);
76             g[u].push_back(v);
77             in[v]++;
78         }
79         LL rt;
80         for(LL i=1;i<=n;i++){
81             if(in[i]==0){
82                 rt=i;
83                 break;
84             }
85         }
86         ans=0;
87         if(a[rt]==0) add(maxx,1);
88         else add(ma[k/a[rt]],1);
89         dfs(rt);
90         printf("%I64d\n",ans);
91     }
92     return 0;
93 }

转载于:https://www.cnblogs.com/ITUPC/p/5861453.html

树形DP+树状数组 HDU 5877 Weak Pair相关推荐

  1. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  2. HDU - 5877 Weak Pair(离散化+树状数组+dfs序)

    题目链接:点击查看 题目大意:给定一个n个节点的树,每个节点都有权值,现在定义weak pair(u,v)需要满足的两个条件: u是v的祖先: ; 问给定的树中有多少个weak pair: 题目分析: ...

  3. HDU - 5877 Weak Pair (dfs序+树状数组+离散化)

    VJ地址 题意:给一个有根树给你,计算一下满足下列条件的序列对的数目 (1)u是v的祖先(不能是它自己) (2)a[v]*a[u]<=k 思路:用DFS序分裂每一条链,使链上的点都是当前加入点的 ...

  4. HDU 2836 Traversal 简单DP + 树状数组

    题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...

  5. HDU 4455 Substrings(dp+树状数组优化)

    题意: 给定一个序列ai,个数为n.再给出一系列w: 对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数 解析: 一直想不出来怎么转移,看了网络上面的题解才明白怎么做 ...

  6. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

  7. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  8. dp 树状数组 逆序元组

    wmq的队伍 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 2000ms   内存限制: 512M 描述 交大上课需要打卡,于是在上课前的 ...

  9. BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...

最新文章

  1. 谷歌提出「卷积+注意力」新模型,超越ResNet最强变体!
  2. Android开发之单例模式初探
  3. Go指南练习_rot13Reader
  4. wxWidgets:wxApp类用法
  5. pyinstaller生成exe文件失败
  6. Python3 实现建造者模式
  7. 《统一沟通-微软-实战》-6-部署-5-边缘服务器-2012-07-12-1
  8. linux思科认证,思科CCIE认证知识点之IPv6地址
  9. 机器学习代码实战——网格搜索和交叉验证(GridSearchCV)
  10. Linux下连接SQL Server
  11. java 并发编程实战代码_「Java并发编程实战」对象的组合
  12. teamview外网连接服务器虚拟主机,利用路由器端口映射+桥接虚拟机搭建个人服务器...
  13. Ubuntu系统安装字体方法
  14. 运营到底是做什么的?
  15. 阿里聚石塔服务张北迁移问题
  16. vscode 全局背景图片设置 background
  17. 报Warning如下: Warning: The CUDA driver must recompile the GPU librariesbecause your device is more rec
  18. 《MATLAB图像处理实例详解》:CH_7(图像分割技术)
  19. 【重磅新闻】罗永浩约战王自如:一场两败俱伤的战役!
  20. Esper epl语句详解

热门文章

  1. 最全的HTML特殊字符集
  2. Java 中的位运算
  3. applet实现大文件ftp上传(三)
  4. HTML、CSS知识点总结,浅显易懂。
  5. spring-boot注解详解(三)
  6. docker运行我们的容器
  7. js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
  8. [Java核心技术(卷I)] - vscode手动编译运行继承类
  9. 第八次作业——系统设计与团队分配(个人)
  10. python 中cPickle学习二