题目链接:https://nanti.jisuanke.com/t/38229

题目大意:给你n个点,n-1条边,然后是m次询问,每一次询问给你u,v,w然后问你从u -> v 的路径上有多少边是小于等于w的、

AC代码:

 #include<iostream>
#include<cmath>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int maxn = 3e5+;
int n,m,num,tot,cnt,totn;
int a[maxn];
int head[maxn];
int root[maxn];
struct Query
{
int l,r,tt;
} que[maxn];
struct Tree
{
int ls,rs,sum;
} tr[maxn*];
struct Edge
{
int from,to,val,s;
} edges[maxn<<];
void addedge(int x,int y,int z)
{
edges[++tot]=Edge{x,y,z,head[x]};
head[x]=tot;
}
int d[maxn],fa[maxn],size[maxn],w[maxn];
int son[maxn];
int rk[maxn],kth[maxn],top[maxn];
void dfs1(int u,int pre,int val)
{ d[u]=d[pre]+;
fa[u]=pre;
size[u]=;
w[u]=val;
for(int i=head[u]; i!=-; i=edges[i].s)
{
Edge &e=edges[i];
if(e.to==pre)
continue;
dfs1(e.to,u,e.val);
size[u]+=size[e.to];
if(size[e.to]>size[son[u]])
son[u]=e.to;
}
}
void dfs2(int u,int y)
{
rk[u]=++cnt;
kth[cnt]=u;
top[u]=y;
if(son[u]==)
return ;
dfs2(son[u],y);
for(int i=head[u]; i!=-; i=edges[i].s)
{
Edge &e=edges[i];
if(e.to==son[u]||e.to==fa[u])
continue;
dfs2(e.to,e.to);
}
}
void buildtree(int &x,int l,int r)
{
x=++totn;
if(l==r)
return ;
int mid=(l+r)>>;
buildtree(tr[x].ls,l,mid);
buildtree(tr[x].rs,mid+,r);
}
void add(int &x,int last,int l,int r,int p)
{
x=++totn;
tr[x]=tr[last];
if(l==r)
{
tr[x].sum++;
return ;
}
int mid=l+r>>;
if(p<=mid)
add(tr[x].ls,tr[last].ls,l,mid,p);
if(p> mid)
add(tr[x].rs,tr[last].rs,mid+,r,p);
tr[x].sum=tr[tr[x].ls].sum+tr[tr[x].rs].sum;
}
int ask(int ql,int qr,int l,int r,int kk)
{
if(<=l&&r<=kk)
return tr[qr].sum-tr[ql].sum;
int mid=l+r>>,ans=;
if(<=mid)
ans+=ask(tr[ql].ls,tr[qr].ls,l,mid,kk);
if(mid<kk)
ans+=ask(tr[ql].rs,tr[qr].rs,mid+,r,kk);
return ans;
}
int get_sum(int x,int y,int tt)
{
int ans=;
int fx=top[x],fy=top[y];
while(fx!=fy)
{
if(d[fx]<d[fy])
swap(x,y),swap(fx,fy);
ans+=ask(root[rk[fx]-],root[rk[x]],,num,tt);
x=fa[fx];
fx=top[x];
}
if(d[x]<d[y])
swap(x,y);
ans+=ask(root[rk[y]],root[rk[x]],,num,tt);
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
ll x,y,z,id,ans;
for(int i=; i<=n; i++)
{
head[i]=-;
}
for(int i=; i<=n-; i++)
{
scanf("%d %d %d",&x,&y,&z);
a[++num]=z;
addedge(x,y,z);
addedge(y,x,z);
}
for(int i=; i<=m; i++)
{
scanf("%d %d %d",&que[i].l,&que[i].r,&que[i].tt);
a[++num]=que[i].tt;
}
sort(a+,a+num+);
num=unique(a+,a+num+)-a-;
dfs1(,,inf);
dfs2(,);
for(int i=; i<=n; i++)
{
w[i]=lower_bound(a+,a+num+,w[i])-a;
}
buildtree(root[],,num);
for(int i=; i<=n; i++)
{
add(root[i],root[i-],,num,w[kth[i]]);
}
for(int i=; i<=m; i++)
{
que[i].tt=lower_bound(a+,a+num+,que[i].tt)-a;
int ans=get_sum(que[i].l,que[i].r,que[i].tt);
printf("%d\n",ans);
}
return ;
}

Distance on the tree(数剖 + 主席树)的更多相关文章

  1. 【洛谷2633】Count on a tree(树上主席树)

    点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...

  2. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

  3. 【BZOJ4408】[FJOI2016]神秘数(主席树)

    [BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...

  4. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)

    Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...

  5. HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

    题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...

  6. 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)

    http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...

  7. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树

    2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...

  8. 洛谷P4587 神秘数 [FJOI2016] 主席树

    正解:主席树 解题报告: 先放下传送门QAQ 首先可以先思考如果只有一组询问,怎么解决 可以这么想,最开始一个数也麻油的时候能表示的最大的数是0嘛 然后先排个序,按顺序每次新加入一个数x,设加入这个数 ...

  9. BZOJ4408: [Fjoi 2016]神秘数【主席树好题】

    Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ...

随机推荐

  1. WEB框架-Django框架学习-预备知识

    今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...

  2. [LeetCode] 4. 寻找两个有序数组的中位数

    题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 ...

  3. DeeplabV3+ 训练自己的遥感数据

    一.预处理数据部分 1.创建 tfrecord(修改 deeplab\ dateasets\ build_data.py) 模型本身是把一张张 jpg 和 png 格式图片读到一个 Example 里 ...

  4. SpringBoot整合RabbitMQ-消息可靠性投递

    本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc. ...

  5. Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)

    1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...

  6. DAO 四个包的建立

    一.DAO 四个包的建立,降低代码之间的耦合性? 之前写代码,都是在一个包下.代码耦合性较高,不利于后期的维护. dao(代码分层?) 有利于后期的维护代码,修改方便. com.aaa.dao 存放d ...

  7. form表单中新增button按钮,点击按钮表单会进行提交

    原生button控件,在非ie浏览器下,如果不指定type,默认为submit类型.如果不想自动提交表单,指定type=“button”

  8. ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)【奇葩的bug】

    #  Bug描述 今天周末,在家里学点新技术,虽然公司分配的任务没有完成(滑稽滑稽) 我先创建了一个mysql数据库,用root用户创建一个新用户,毕竟项目中使用root是非常危险的,尤其是我这样的实 ...

  9. supervisor进程管理的使用

    介绍 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理 ...

  10. Magento 2 Theme Ultimate Guide - 如何创建Magento 2主题终极指南

    Magento 2 Theme Ultimate Guide - 如何创建Magento 2主题基础指南 在Magento 2中管理和设置主题的方式有很多改进.Magento 1.9中引入的theme ...