[HDOJ5877]Weak Pair(DFS,线段树,离散化)
题目链接: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 ;
}
[HDOJ5877]Weak Pair(DFS,线段树,离散化)的更多相关文章
- HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: weak pair的要求: 1.u是v的祖先(注意不一定是父亲) 2.val[u]*va ...
- hdu 5877 Weak Pair dfs序+树状数组+离散化
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Prob ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线
Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- [poj2528] Mayor's posters (线段树+离散化)
线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...
- [UESTC1059]秋实大哥与小朋友(线段树, 离散化)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
随机推荐
- android 项目学习随笔三(Fragment )
1.在主页面(activity引用Fragment )的布局文件中定义FrameLayout ,加载Fragment <FrameLayout xmlns:android="http ...
- django templates学习使用记录
可以在基本模板中多插入几个black来适应不同的布局
- Git的搭建和使用技巧完整精华版
[Git使用技巧] 1.把一个已经存在于版本库中的文件加入忽略提交文件(.gitignore)中,需要如下代码: git rm --cached [文件路径] 例如: git rm --cached ...
- discuz x2 diy 模块的样式点击不管用,模块的数据、标题都可以编辑
这个是diy模板的文件忘记添加 <style id="diy_style" type="text/css"></style> 一 ...
- discuz模板文件列表
template/default/common模板公共文件夹,全局相关 |--block_forumtree.htm 树形论坛版块分支js文件 |--block_thread.htm特 ...
- C++智能指针管理类
1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 ...
- 20151210001 DataGridView 选中与被选中
// DataSet_IP list private void DataSet_IP_list() { DataSet_IP = new System ...
- DAG模型
数字三角形: 1.递归计算 int solve(int i,int j) { :max(solve(i+,j),solve(i+,j+))); } 2.记忆化搜索,不用指明计算顺序,并且保证每个状态只 ...
- protobuf安装
Protocol Buffers - Google's data interchange format 一.简介 名字已经很好的说明它是什么,这里还是要简单的介绍一下,protobuf是protoco ...
- linux poll 学习
一.poll介绍 函数原型: #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout); struc ...