hdu6162】的更多相关文章

hdu6162 题意 给出一颗带点权的树,每次询问一对节点 \((u, v)\),问 \(u\) 到 \(v\) 的最短路径上所有节点权值在 \([c1, c2]\) 区间内的和. 分析 树链剖分,那么我们只需要处理一个区间内节点权值在 \([c1, c2]\) 之间的和.建一颗线段树,每个节点维护当前区间内所有的点已经排序后的权值,以及前缀和.那么两次二分,前缀和相减就可以快速得到区间内权值在 \([c1, c2]\) 的所有节点的和. code #include<bits/stdc++.h>…
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6162 题目: Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 526    Accepted Submission(s): 177 Problem Description Mr. Cui is working of…
 题意:一棵树,每个点有个权值,m次询问,每次给你一条链和两个值a,b,问你这条链上权值在[a,b]之间的权值的和是多少. std竟然是2个log的……完全没必要链剖,每个结点的主席树从其父节点转移过来,这样每个结点的主席树存储的就是它到根点的权值. 然后链询问,直接在主席树上作差,T[u]+T[v]-T[lca(u,v)]-T[fa(lca(u,v))]即可.只有一个log. 当然要先离散化. #include<cstdio> #include<algorithm> #inclu…
这题一开始把我看愣了.难道是线段树套树状数组?空间根本开不下好不好!!! 后来想到维护区间极值,从而排除不必要情况,降低复杂度. 无需修改,码量顿减…… 注意,同一组数据放一行,注意行末空格. #include<bits/stdc++.h> using namespace std; #define int long long ; int n,m,val[maxn]; int beg[maxn],nex[maxn],to[maxn],e; void add(int x,int y){ e++;n…