https://nanti.jisuanke.com/t/38229

题目:

给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数。

#include <bits/stdc++.h>
#define mid (l+r>>1)
#define lson (o<<1)
#define rson (o<<1|1)
#define all(x) (x).begin(),(x).end()
using namespace std;
const int N = 2e5+;
vector<int>nxt[N],len[N];
int fa[N],deep[N],id[N],siz[N],son[N],tot,s[N],top[N],ss[N];
int n,m;
int SIZ; struct TREE{
int l,r,x;
}tree[N*];
int rk[N],Tot,rt[N];
void insert(int &o,int l,int r,int data){
tree[++Tot] = tree[o];
o = Tot;
tree[o].x++;
if(l==r) return ;
if(mid>=data) insert(tree[o].l,l,mid,data);
else insert(tree[o].r,mid+,r,data);
}
int query(int lo,int ro,int l,int r,int h,int t){
if(l>=h&&r<=t) return tree[ro].x-tree[lo].x;
int ans = ;
if(mid>=h) ans += query(tree[lo].l,tree[ro].l,l,mid,h,t);
if(mid<t) ans += query(tree[lo].r,tree[ro].r,mid+,r,h,t);
return ans;
} void dfs(int u,int f) {
deep[u] = deep[f]+;
son[u] = ;
siz[u] = ;
fa[u] = f;
for(int i = ; i < nxt[u].size(); i++) {
int v = nxt[u][i];
int w = len[u][i];
if(v==f) continue;
s[v] = w;
dfs(v,u);
siz[u] += siz[v];
if(siz[son[u]]<siz[v]) son[u] = v;
}
}
void dfs2(int u,int t) {
id[u] = ++tot;
ss[id[u]] = s[u];
top[u] = t;
if(son[u]) dfs2(son[u],t);
for(auto v:nxt[u]) {
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int Query(int u,int v,int x) {
int tu = top[u];
int tv = top[v];
int ans = ;
while(tu!=tv) {
if(deep[tu]<deep[tv]) {
swap(u,v);
swap(tu,tv);
}
ans += query(rt[id[tu]-],rt[id[u]],,SIZ,,x);
u = fa[tu];
tu = top[u];
}
if(u==v) return ans;
if(id[u]>id[v]) swap(u,v);
ans += query(rt[id[u]],rt[id[v]],,SIZ,,x);
return ans;
} struct Q{
int u, v, w;
}Q[N];
vector<int> k;
int main() {
scanf("%d%d",&n,&m);
for(int i = ; i < n; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
nxt[u].push_back(v);
nxt[v].push_back(u);
len[u].push_back(w);
len[v].push_back(w);
k.push_back(w);
}
for(int i = ; i <= m; i++) {
int u, v, x;
scanf("%d%d%d",&Q[i].u,&Q[i].v,&Q[i].w);
k.push_back(Q[i].w);
}
sort(all(k));
k.erase(unique(all(k)),k.end());
SIZ = k.size()+;
dfs(,);
dfs2(,);
rt[] = ;
tree[].l = tree[].r = tree[].x = ;
for(int i = ; i <= n; i++) {
rt[i] = rt[i-];
int x = lower_bound(all(k),ss[i])-k.begin()+;
insert(rt[i],,SIZ,x);
}
for(int i = ; i <= m; i++) {
int x = lower_bound(all(k),Q[i].w)-k.begin()+;
printf("%d\n",Query(Q[i].u,Q[i].v,x));
}
return ;
}

南昌网络赛 Distance on the tree 主席树+树剖 (给一颗树,m次查询ui->vi这条链中边权小于等于ki的边数。)的更多相关文章

  1. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  2. dp--2019南昌网络赛B-Match Stick Game

    dp--2019南昌网络赛B-Match Stick Game Xiao Ming recently indulges in match stick game and he thinks he is ...

  3. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  4. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  5. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  6. 南昌网络赛C.Angry FFF Party

    南昌网络赛C.Angry FFF Party Describe In ACM labs, there are only few members who have girlfriends. And th ...

  7. 南昌网络赛 H The Nth Item

    南昌网络赛The Nth Item 暴力快速幂+unordered_map记忆化 注意:记忆化不能写到快速幂求解函数里,不断调用函数会造成很大的时间浪费 #include<bits/stdc++ ...

  8. 分治维护dp——19南昌网络赛C/cf750E

    南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ...

  9. 2019 ICPC 南昌网络赛

    2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...

随机推荐

  1. Mockplus组件样式库一键解决风格复用

    在Mockplus3.3版本中,新增了组件样式库,可以快速复用组件风格,同时可以将组件风格保存到库中. 官网地址:https://www.mockplus.cn 1. 保存样式 选中组件,设置好该组件 ...

  2. ie8开发人员工具无法使用,按f12任务栏里出现任务,但是窗体不弹出

    楼主解决了么,刚出现你这样的问题,找了N久,终于解决了,他娘的,偏方啊任务栏不是出现那个箭头么,点击后没反应是吧在缩略图上点右键-最大化,然后就出来了,ctrl+p反正是可以出来调试模式 神人哪,IE ...

  3. JavaScript 语法总结

    1. 不能为基本类型变量添加属性和方法. 如果添加了,那么也是undefined的. var str = "a string"; str.attr = "attr&quo ...

  4. 友盟统计小白教程:创建应用,申请appkey

    上回书讲到,我们已经和一个靠谱的人选择一个靠谱的统计平台注册了一个帐号,下面就该创建一个应用了. 介绍一个基础知识: appkey:友盟识别app的唯一标识,目前友盟平台上超过500000款App,每 ...

  5. serialVersionUID的作用以及IDEA、Eclipse如何自动生成serialVersionUID

    说到serialVersionUID,首先要讲讲序列化. 序列化: 序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库.文件系统中,反序列化则是可以把之前持久化在数据库或 ...

  6. 6、Docker Image

    6.1 什么是image 文件和meta data的集合(root filesystem) 分层的,并且每一层都可以添加.改变.删除文件,成为一个新的image 不同的image可以共享相同的laye ...

  7. Docker在github上的站点

    https://github.com/docker (docker在github上的官方地址) https://github.com/dockerfile (docker官方镜像的Dockerfile ...

  8. Solr相似度算法四:IBSimilarity

    Information based:它与Diveragence from randomness模型非常相似.与DFR相似度模型类似,据说该模型也适用于自然语言类的文本.

  9. c#设计模式之代理模式(Proxy Pattern)

    引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...

  10. 控制 MediaElement(播放、暂停、停止、音量和速度)

    控制 MediaElement(播放.暂停.停止.音量和速度) WPF中对于多媒体的支持非常完整,一般都是通过MediaElement来实现的. http://msdn.microsoft.com/z ...