Distance on the tree(数剖 + 主席树)
题目链接: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(数剖 + 主席树)的更多相关文章
- 【洛谷2633】Count on a tree(树上主席树)
点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...
- BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...
- 【BZOJ4408】[FJOI2016]神秘数(主席树)
[BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...
- Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)
Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...
- HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)
题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...
- 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)
http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...
- 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 ...
- 洛谷P4587 神秘数 [FJOI2016] 主席树
正解:主席树 解题报告: 先放下传送门QAQ 首先可以先思考如果只有一组询问,怎么解决 可以这么想,最开始一个数也麻油的时候能表示的最大的数是0嘛 然后先排个序,按顺序每次新加入一个数x,设加入这个数 ...
- BZOJ4408: [Fjoi 2016]神秘数【主席树好题】
Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = ...
随机推荐
- 创建DVWA环境时遇到的问题
前言:我下载了PHP Study,也按照步骤下载保存了DVWA,之后我又按照百度的准备登陆检查是否正确安装DVWA,于是,我登录了百度上查到的链接:http://localhost/DVWA-mast ...
- os模块使用
Python获取当前文件名的两种方法 1,使用python文件默认的‘ file ’属性 2,使用 sys.argv[0] print sys.argv # 输入参数列表print sys.argv[ ...
- mybatis从mapper接口跳转到相应的xml文件的eclipse插件
mybatis从mapper接口跳转到相应的xml文件的eclipse插件 前提条件 开发软件 eclipse 使用框架 mybatis 为了方便阅读源码,项目使用mybatis的时候,方便从mapp ...
- 拜托!面试请不要再问我Spring Cloud底层原理
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- Entity Framework Core系列之DbContext
前言: EF Core DbContext表示与数据库的会话,并提供与数据库通信的API,具有以下功能: 数据库连接 数据操作,如查询和持久化 更改追踪 模型构建 数据映射 对象缓存 事务管理 数据库 ...
- String Successor zoj 3490
链接 [https://vjudge.net/contest/294259#problem/D] 题意 就是给你一个字符串,要进行n次操作 让你输出每次的字符串 操作规则: 1.如果有数字或者字母就忽 ...
- 跨域两种解决方案CORS以及JSONP
一.CORS设置请求头 设置请求头实现跨域: //跨域的浏览器会让请求带Origin头,表明来自哪里的跨域请求 Origin: http://xxx.example //表明允许跨域访问 Access ...
- 手动用tomcat启动war包,无法访问web项目
先说一下自己采的小坑,网上大多解答都是复制来复制去,不说重点在哪.我这里简单总结下访问路径问题 一.用idea打成war包,具体步骤如下图: 步骤:在项目配置选Artifacts新建Web Appli ...
- 开发中的Date处理
数据库中的日期格式有以下几种: date:年-月-日 time:时:分:秒 datatime:年-月-日 时:分:秒 timestrap: 例如,生日显示格式为'年-月-日',而创建/更新时间格式为' ...
- HTTP状态码表
HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.所有状态码的第一个数字代表了响应的五种状态之一. 1xx消息 这一类型的状态码,代表请求已被 ...