树形DP+树状数组 HDU 5877 Weak Pair
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相关推荐
- 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 ...
- HDU - 5877 Weak Pair(离散化+树状数组+dfs序)
题目链接:点击查看 题目大意:给定一个n个节点的树,每个节点都有权值,现在定义weak pair(u,v)需要满足的两个条件: u是v的祖先: ; 问给定的树中有多少个weak pair: 题目分析: ...
- HDU - 5877 Weak Pair (dfs序+树状数组+离散化)
VJ地址 题意:给一个有根树给你,计算一下满足下列条件的序列对的数目 (1)u是v的祖先(不能是它自己) (2)a[v]*a[u]<=k 思路:用DFS序分裂每一条链,使链上的点都是当前加入点的 ...
- HDU 2836 Traversal 简单DP + 树状数组
题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...
- HDU 4455 Substrings(dp+树状数组优化)
题意: 给定一个序列ai,个数为n.再给出一系列w: 对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数 解析: 一直想不出来怎么转移,看了网络上面的题解才明白怎么做 ...
- 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)
题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...
- 小魂和他的数列(dp+树状数组优化)
链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...
- dp 树状数组 逆序元组
wmq的队伍 发布时间: 2017年4月9日 17:06 最后更新: 2017年4月9日 17:07 时间限制: 2000ms 内存限制: 512M 描述 交大上课需要打卡,于是在上课前的 ...
- 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 ...
最新文章
- 谷歌提出「卷积+注意力」新模型,超越ResNet最强变体!
- Android开发之单例模式初探
- Go指南练习_rot13Reader
- wxWidgets:wxApp类用法
- pyinstaller生成exe文件失败
- Python3 实现建造者模式
- 《统一沟通-微软-实战》-6-部署-5-边缘服务器-2012-07-12-1
- linux思科认证,思科CCIE认证知识点之IPv6地址
- 机器学习代码实战——网格搜索和交叉验证(GridSearchCV)
- Linux下连接SQL Server
- java 并发编程实战代码_「Java并发编程实战」对象的组合
- teamview外网连接服务器虚拟主机,利用路由器端口映射+桥接虚拟机搭建个人服务器...
- Ubuntu系统安装字体方法
- 运营到底是做什么的?
- 阿里聚石塔服务张北迁移问题
- vscode 全局背景图片设置 background
- 报Warning如下: Warning: The CUDA driver must recompile the GPU librariesbecause your device is more rec
- 《MATLAB图像处理实例详解》:CH_7(图像分割技术)
- 【重磅新闻】罗永浩约战王自如:一场两败俱伤的战役!
- Esper epl语句详解