HDU 5877 Weak Pair(dfs + 树状数组 + 离散化)
来源:互联网 发布:软件测试管理体系 编辑:程序博客网 时间:2024/05/17 04:15
#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<string>#include<stack>#include<vector>#include<queue>#include<set>#include<algorithm>#include<iostream>typedef long long ll;const int maxn = 1e5 + 10;const double eps = 1e-7;const ll INF = 1e18;using namespace std;ll C[maxn * 2], a[maxn * 2], b[maxn * 2];vector<int> G[maxn];int n, T, num, nn;ll k;int ch[maxn];ll res;void init() { num = 0; res = 0; for(int i = 0; i < maxn; i++) G[i].clear(); memset(C, 0, sizeof(C)); memset(ch, 0, sizeof(ch));}ll sum(int ind) { ll s = 0; while(ind) { s += C[ind]; ind -= ind & -ind; } return s;}void update(int ind, int add) { while(ind <= nn) { C[ind] += add; ind += ind & -ind; }}void dfs(int u, int d) { if(!a[u]) res += d; else { int ind = lower_bound(b, b + nn, k / a[u]) - b + 1; res += sum(ind); } int c = lower_bound(b, b + nn, a[u]) - b + 1; update(c, 1); for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; dfs(v, d + 1); } update(c, -1);}int main(){ scanf("%d", &T); while(T--) { init(); scanf("%d %lld", &n, &k); for(int i = 1; i <= n; i++) { scanf("%lld", &a[i]); b[num++] = a[i]; if(a[i]) b[num++] = k / a[i]; } sort(b, b + num); nn = unique(b, b + num) - b; for(int i = 1; i < n; i++) { int f, t; scanf("%d %d", &f, &t); G[f].push_back(t); ch[t] = 1; } int node; for(int i = 1; i <= n; i++) { if(!ch[i]) { node = i; break; } } dfs(node, 0); printf("%lld\n", res); } return 0;}
题意:给出一棵树,求出a[u] * a[v] <= k的(u,v)的对数
思路:搜索过程中用树状数组更新同深度的值,一个节点只能从根节点由一条路而来,相当于在一条路径上用树状数组
0 0
- HDU 5877 Weak Pair(dfs + 树状数组 + 离散化)
- hdu 5877 Weak Pair(树状数组 + dfs + 离散化)
- HDU 5877 Weak Pair 【dfs】【树状数组】【离散化】
- HDU 5877 Weak Pair dfs序 + 树状数组 + 离散化
- 2016 大连网络赛 HDU 5877 Weak Pair (DFS + 树状数组 + 离散化)
- HDU-5877-Weak Pair【树状数组】【离散化】【DFS】【2016大连网络】【好题】
- HDU 5877 Weak Pair(离散化+dfs+树状数组) 大连区域网络赛
- hdu 5877 Weak Pair 树状数组+离散化
- HDU 5877 Weak Pair 树状数组 + DFS
- hdu5877 Weak Pair(离散化+树状数组+dfs)
- HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化
- HDU 5877 Weak Pair(离散化+dfs+树状数组)——2016 ACM/ICPC Asia Regional Dalian Online
- HDU-5877-Weak Pair(离散+树状数组)
- hdu 5877 Weak Pair(dfs+树状数组)
- HDU 5877 Weak Pair 2016 ACM/ICPC Asia Regional Dalian Online(树状数组+离散化)
- hdu 5877 - Weak Pair (2016大连网络赛) 离散化 + 树状数组
- 2016年ACM/ICPC 亚洲区域赛 大连站 1011 Weak Pair(现HDU 5877) 树状数组离散化+dfs
- hdu 5877 Weak Pair(树状数组)
- PAT甲级真题目录(按题型整理)
- hdu5869 Different GCD Subarray Query(rmq+树状数组+gcd)
- Linux命令(17):which
- 数据加密和解密
- 【JZOJ 4770】 闭门造车(平面最近点对)
- HDU 5877 Weak Pair(dfs + 树状数组 + 离散化)
- 7.22 T hdu1102 Constructing Roads
- ImageLoader
- innerText和innerHtml的区别
- 2016 ICPC 大连网络赛 HDU 5873 Football Games
- javaEE cookie保存中文时报错
- 华为交换机堆叠和集群配置
- 将本地代码上传到github
- Andorid中UI控件的详细介绍(四)——EditText