题目大意:给你一棵树,有n-1条边,每条边都有方向,每个顶点有权值,给出weak pair的定义是val[u]*val[v] <=k,u是v的祖先,问有多少对这样的顶点

思路:创建线段树,通过dfs动态创建,每次都不断更新。因为我们只能是根节点开始往下的,所以我们遍历到兄弟节点的之前要把其他的兄弟节点的信息给删除掉。(这就和用vis标记一样的,一会儿变为true,一会儿变为false)

不过我很奇怪,为啥我的代码没有吧k/a[i]放进去就迷之RE了

当然,这道题也可以用主席树做,也可以用treap做

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int maxn = 4e5 + ;
LL a[maxn], b[maxn], d[maxn], tree[maxn * ];
LL n, m, k, lenb, ans;
vector<int> E[maxn]; int query(int o, int l, int r, int ql, int qr){
if (l >= ql && r <= qr){
return tree[o];
}
int cnt = ;
int mid = (l + r) / ;
if (ql <= mid) cnt += query(o << , l, mid, ql, qr);
if (qr > mid) cnt += query(o << | , mid + , r, ql, qr);
return cnt;
} inline void push_up(int o){
int lb = o << , rb = o << | ;
tree[o] = tree[lb] + tree[rb];
} void update (int o, int l, int r, int pos, int val){
if (l == r && l == pos) {
tree[o] += val;
return ;
}
int mid = (l + r) / ;
if (pos <= mid) update(o << , l, mid, pos, val);
if (pos > mid) update(o << | , mid + , r, pos, val);
push_up(o);
} void dfs(int u){
int pos = lower_bound(b + , b + + m, a[u]) - b;
int posk = lower_bound(b + , b + + m, k / a[u]) - b;
ans += query(, , lenb, , posk);
int len = E[u].size();
update(, , lenb, pos, );
for (int i = ; i < len; i++){
int v = E[u][i];
dfs(v);
}
update(, , lenb, pos, -);
} int main(){
int t; cin >> t;
while (t--){
memset(d, , sizeof(d));
memset(tree, , sizeof(tree));
scanf("%I64d%I64d", &n, &k);
for (int i = ; i <= n; i++){
scanf("%I64d", a + i);
b[i] = a[i];
E[i].clear();
}
m = n;
for (int i = ; i <= n; i++) b[++m] = k / a[i]; sort(b + , b + + m);
lenb = unique(b + , b + + m) - b - ;///序列长度1~n
///printf("lenb = %d\n", lenb);
for (int i = ; i <= n - ; i++){
int u, v; scanf("%d%d", &u, &v);
E[u].pb(v);
d[v]++;
}
ans = ;
for (int i = ; i <= n; i++){
if (d[i] == ){
dfs(i);
break;
}
}
printf("%I64d\n", ans);
}
return ;
}

在线更新问题 HDU5877 线段树的更多相关文章

  1. HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: weak pair的要求: 1.u是v的祖先(注意不一定是父亲) 2.val[u]*va ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. opencv轮廓处理函数详细

    ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int me ...

  2. mac中eclipse安装openExplore插件

    插件地址:https://github.com/samsonw/OpenExplorer/downloads 将下载的jar包放入下面地址:应用程序->eclipse.app,右击->打开 ...

  3. TCP拥塞处理—Congestion Handing

      TCP拥塞处理-Congestion Handing 1 慢启动 2 拥塞避免 3 快重传/拥塞发生(拥塞发生时的快速重传) 4 快恢复

  4. Astyle编程语言格式化工具的说明

    1.工具->扩展和更新,搜astyle插件,下载安装重启,当前是2.0版本. 2.工具->选项->AStyle Formatter->Edit,填入下面的,点击save,确定. ...

  5. Chapter 2 Open Book——6

    Last night I'd discovered that Charlie couldn't cook much besides friedeggs and bacon. 昨天晚上我终于发现查理除了 ...

  6. 利用文本编辑器输入课堂上练习的Hello.java,并在JDK环境下编译和运行。

  7. FUSE and File System

    FUSE: File system in USErspace. So what is a file system? A file system maps file paths to file cont ...

  8. ubuntu 连接VPN 命令

    1  注册MXVPN 2 启动VPN  pptpsetup --create mxvpn1 --server xx.xx.xx.xx --username *** --password *** --e ...

  9. doclint in jdk8

    http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html Turning off doclint in JDK 8 ...

  10. POJ 2368 巴什博奕

    题目大意:给出n个按钮,每次最多可以按L个,按下最后一个按钮的人获胜.求使后手必定获胜的L的最小值(L>=2). 题目思路: 巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少 ...