贴贴大佬的计蒜客题解:

The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest

离线处理,
运用树链剖分让LCA跑快点

关键是把n-1条边,和m条询问边存起来

然后按边权值W进行升序;

这样在计数询问的时候我们从小到大计数;

每条边只会被记一次且从小到大,这样就不用担心当前计数会受上一计数更新时的影响;

每次把小于等于当前查询的边加到链上;

查询就是查询链上有多少条边被加入过;

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+10;
inline int read(){
int sum=0,x=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
x=0;
ch=getchar();
}
while(ch>='0'&&ch<='9')
sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
return x?sum:-sum;
}
int f[M],sz[M],deep[M],son[M],dfn[M],top[M],ans[M],t[M<<2],n,cnt;
vector<int >graph[M];
struct node{
int u,v,w,index;
bool operator<(const node &b)const{
return w<b.w;
}
}q[M],e[M];
void dfs1(int u,int from){
f[u]=from;
sz[u]=1;
deep[u]=deep[from]+1;
for(int i=0;i<graph[u].size();i++){
int v=graph[u][i];
if(v!=from){
dfs1(v,u);
sz[u]+=sz[v]; if(sz[v]>sz[son[u]])
son[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t;
dfn[u]=++cnt;
if(!son[u])
return ;
dfs2(son[u],t);
for(int i=0;i<graph[u].size();i++){
int v=graph[u][i];
if(v!=son[u]&&v!=f[u]){
dfs2(v,v);
}
}
}
void update(int sign,int c,int root,int l,int r){
if(l==r){
t[root]+=c;
return ;
}
int midd=l+r>>1;
if(sign<=midd)
update(sign,c,root<<1,l,midd);
else
update(sign,c,root<<1|1,midd+1,r);
t[root]=t[root<<1]+t[root<<1|1];
}
int find(int L,int R,int root,int l,int r){
if(L<=l&&r<=R)
return t[root];
int midd=l+r>>1;
int c=0;
if(L<=midd)
c+=find(L,R,root<<1,l,midd);
if(R>midd)
c+=find(L,R,root<<1|1,midd+1,r);
return c;
}
int solve(int u,int v){
int c=0;
int fu=top[u],fv=top[v];
while(fu!=fv){
if(deep[fu]>=deep[fv]){
c+=find(dfn[fu],dfn[u],1,1,n);
u=f[fu],fu=top[u];
}
else{
c+=find(dfn[fv],dfn[v],1,1,n);
v=f[fv],fv=top[v];
} }
if(dfn[u]<dfn[v])
c+=find(dfn[u]+1,dfn[v],1,1,n);
else if(dfn[u]>dfn[v])
c+=find(dfn[v]+1,dfn[u],1,1,n);
return c; }
int main(){
n=read();
int m=read();
for(int i=1;i<n;i++){
int x=read(),y=read(),w=read();
e[i].u=x,e[i].v=y,e[i].w=w;
graph[x].push_back(y);
graph[y].push_back(x);
}
dfs1(1,1);
dfs2(1,1);
/*cout<<"~~~~~~~~~";
for(int i=1;i<=n;i++)
cout<<dfn[i]<<" ";
cout<<endl;*/
for(int i=1;i<=m;i++){
int x=read(),y=read(),w=read();
q[i].u=x,q[i].v=y,q[i].w=w;
q[i].index=i;
}
sort(e+1,e+n);
sort(q+1,q+1+m);
int cur=1;
for(int i=1;i<=m;i++){
while(cur<n&&e[cur].w<=q[i].w){
int u=e[cur].u,v=e[cur].v;
if(deep[u]<deep[v])
swap(u,v);
update(dfn[u],1,1,1,n);
cur++;
}
ans[q[i].index]+=solve(q[i].u,q[i].v);
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}

  

J. Distance on the tree(树链剖分+线段树)的更多相关文章

  1. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  2. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  3. POJ3237 Tree 树链剖分 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...

  4. 【CF725G】Messages on a Tree 树链剖分+线段树

    [CF725G]Messages on a Tree 题意:给你一棵n+1个节点的树,0号节点是树根,在编号为1到n的节点上各有一只跳蚤,0号节点是跳蚤国王.现在一些跳蚤要给跳蚤国王发信息.具体的信息 ...

  5. Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  6. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  7. [HDU3710] Battle Over Cities [树链剖分+线段树+并查集+kruskal+思维]

    题面 一句话题意: 给定一张 N 个点, M 条边的无向连通图, 每条边上有边权 w . 求删去任意一个点后的最小生成树的边权之和. 思路 首先肯定要$kruskal$一下 考虑$MST$里面去掉一个 ...

  8. 【Codeforces827D/CF827D】Best Edge Weight(最小生成树性质+倍增/树链剖分+线段树)

    题目 Codeforces827D 分析 倍增神题--(感谢T*C神犇给我讲qwq) 这道题需要考虑最小生成树的性质.首先随便求出一棵最小生成树,把树边和非树边分开处理. 首先,对于非树边\((u,v ...

  9. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  10. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

随机推荐

  1. poj 3693 Maximum repetition substring

    呵呵呵呵呵呵呵呵呵呵,sb(神犇)题看了一天,还是不懂 题目要求的是最多重复的,那么就来找重复的,可以先枚举一个重复的单元(比如ababab,就枚举ab)的长度, 然后再原串中,会有ch[0],ch[ ...

  2. 剑指offer题目汇总

    二维数组中的查找 题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中 ...

  3. 10几行代码,用python打造实时截图识别OCR

    你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率. !   今天,我们就来做一款实时截图识别的小工具.顾名思义,运行程序时,可以实时的把你截出来的图片中的文字识别出来. 下 ...

  4. Nginx负载均衡(转发)

    http://www.cnblogs.com/jalja/p/6117881.html 一.反向代理 正向代理: 客户端要获取的资源就在服务器上,客户端请求的资源路径就是最终响应资源的服务器路径,这就 ...

  5. MongoDB四-操作索引

    转自: http://www.cnblogs.com/huangxincheng/archive/2012/02/29/2372699.html 我们首先插入10w数据,上图说话: 一:性能分析函数( ...

  6. [WesternCTF2018]shrine

    0x00 知识点 SSTI模板注入: 模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程 服务端把用户输入的内容渲染成模板就可能造成SSTI(Server-Side Template In ...

  7. POJ - 3658 Artificial Lake

    题意:向N个连续且高度不同的平台灌水,平台各有宽度,且高度各不相同.一开始,先向高度最低的平台灌水,直到灌满溢出,流向其他的平台,直至所有平台都被覆盖.已知每分钟注入高度为1且宽度为1的水,问每个平台 ...

  8. HDU 5428:The Factor

    The Factor  Accepts: 101  Submissions: 811  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65 ...

  9. maven解决大项目打包慢的问题

    裁剪反应堆 -am, --also-make 同时构建所列模块的依赖模块.必须和-pl同时使用.如 mvn -pl test  install -am ,将同时构建test的依赖模块. -amd, - ...

  10. TCP三次握手和四次挥手相关

    客户端A 服务端BSYN (建立连接位标识 1为建立联机) ACK (确认位标识 1为确认) seq (一个随机顺序码) ack(一个确认号码,通常为seq+1) 三次握手:1.A 发起建立 连接 的 ...