博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主席树+树链剖分——南昌邀请赛Distance on the tree
阅读量:4481 次
发布时间:2019-06-08

本文共 2078 字,大约阅读时间需要 6 分钟。

学了差不多一星期的主席树+树链剖分,再来看这题发现其实是个板子题

一开始想复杂了,以为要用类似求树上第k大的树上差分思想来解决这道题,但其实树链上<=k的元素个数其实直接可以用树链剖分来求

具体是把每条树链放到主席树上询问一下求和就好了

#include
using namespace std;#define maxn 100006struct Edge{
int to,nxt,w;}edge[maxn<<1];int b[maxn],n,m,a[maxn],head[maxn],tot; void init(){memset(head,-1,sizeof head);tot=0;}void addedge(int u,int v,int w){ edge[tot].to=v;edge[tot].nxt=head[u];edge[tot].w=w;head[u]=tot++;}struct Node{
int lc,rc,sum;}T[maxn*25];int siz,rt[maxn];int build(int l,int r){ int now=++siz; T[now].lc=T[now].rc=T[now].sum=0; if(l==r)return now; int mid=l+r>>1; T[now].lc=build(l,mid); T[now].rc=build(mid+1,r); return now;} int update(int last,int pos,int l,int r){
//更新到pos点 int now=++siz; T[now]=T[last];T[now].sum++; if(l==r)return now; int mid=l+r>>1; if(pos<=mid)T[now].lc=update(T[last].lc,pos,l,mid); else T[now].rc=update(T[last].rc,pos,mid+1,r); return now;} int query(int st,int ed,int L,int R,int l,int r){ if(L<=l && R>=r)return T[ed].sum-T[st].sum; int mid=l+r>>1,res=0; if(L<=mid)res+=query(T[st].lc,T[ed].lc,L,R,l,mid); if(R>mid)res+=query(T[st].rc,T[ed].rc,L,R,mid+1,r); return res;} int f[maxn],son[maxn],d[maxn],size[maxn];void dfs1(int x,int pre,int deep){ f[x]=pre;size[x]=1;d[x]=deep; for(int i=head[x];i!=-1;i=edge[i].nxt){ int y=edge[i].to; if(y==pre)continue; a[y]=edge[i].w; dfs1(y,x,deep+1); size[x]+=size[y]; if(size[y]>size[son[x]])son[x]=y; }}int id[maxn],rk[maxn],idx,top[maxn];void dfs2(int x,int tp){ top[x]=tp;id[x]=++idx;rk[idx]=x; if(son[x])dfs2(son[x],tp); for(int i=head[x];i!=-1;i=edge[i].nxt){ int y=edge[i].to; if(y!=son[x] && y!=f[x])dfs2(y,y); }}int Query(int x,int y,int pos){ int res=0; while(top[x]!=top[y]){ if(d[top[x]]
id[y])swap(x,y); res+=query(rt[id[x]],rt[id[y]],1,pos,1,m); return res;}int main(){
int q;init(); cin>>n>>q;int u,v,w,k; for(int i=1;i

 

转载于:https://www.cnblogs.com/zsben991126/p/10772061.html

你可能感兴趣的文章
Ansible用于网络设备管理 part 3 使用NAPALM成品库
查看>>
抽象类和接口的区别以及jdk1.8之后接口里面可以实现方法
查看>>
shell命令之一天一见:awk
查看>>
[转]利用JitPack发布自己项目让别人可以在dependencies中compile的简单方法
查看>>
core dump
查看>>
java-枚举一些字典信息的例子
查看>>
temp-存储过程 以前的
查看>>
IT增值服务-客户案例(三):合肥薪火科技,Java和P2P网络借贷系统开发指导
查看>>
Ubuntu下SVN服务器安装和配置
查看>>
Bloom filter
查看>>
并查集最小生成树复习
查看>>
Java虚拟机性能管理神器 - VisualVM(5) 监控远程主机上的JAVA应用程序【转】
查看>>
WebGIS最佳实践-3 为GeoServer编写漂亮的Style
查看>>
(八) Docker Commit
查看>>
const学习(续)
查看>>
Python批量扫描服务器指定端口状态
查看>>
SQL批量插入、修改
查看>>
ThinkPHP控制器、路由、模板和系统常量
查看>>
Postgresql死锁的处理
查看>>
ubuntu配置多网,网关不起作用的问题
查看>>