C64 可持久化线段树+DFS P3899 [湖南集训] 更为厉害
视频链接:250 可持久化线段树+DFS P3899 [湖南集训] 更为厉害_哔哩哔哩_bilibili
#include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; void read(int &x){ //快读 x=0; char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))x=x*10+c-'0',c=getchar(); } #define LL long long #define N 300005 #define mid (l+r)/2 int n,m,mxd=1; //mxd:最大深度 vector<int>g[N]; //邻接表 int dep[N],siz[N],dfn[N],cnt; //树信息 int root[N],tot; //根节点,开点个数 int ls[N*22],rs[N*22];LL sum[N*22]; //持久树 //dep:节点深度,siz:子树大小,dfn:dfs序 //sum:区间方案数的前缀和 void dfs1(int x,int f){ //树信息 dfn[x]=++cnt; siz[x]=1; for(int y:g[x]){ if(y==f) continue; dep[y]=dep[x]+1; mxd=max(mxd,dep[y]); dfs1(y,x); siz[x]+=siz[y]; } } void change(int &u,int v,int l,int r,int dp,int k){ //点修 u=++tot; //动态开点 ls[u]=ls[v];rs[u]=rs[v];sum[u]=sum[v]+k; if(l==r)return; if(dp<=mid)change(ls[u],ls[v],l,mid,dp,k); else change(rs[u],rs[v],mid+1,r,dp,k); } void dfs2(int x,int f){ //建持久树 change(root[dfn[x]],root[dfn[x]-1],1,mxd,dep[x],siz[x]-1); for(int y:g[x]) if(y!=f) dfs2(y,x); } LL query(int u,int v,int l,int r,int x,int y){ //区查 if(x<=l&&r<=y) return sum[u]-sum[v]; LL s=0; if(x<=mid)s+=query(ls[u],ls[v],l,mid,x,y); if(y>mid) s+=query(rs[u],rs[v],mid+1,r,x,y); return s; } int main(){ read(n),read(m); for(int i=1,x,y; i<n; i++){ read(x),read(y); g[x].push_back(y);g[y].push_back(x); } dep[1]=1; dfs1(1,0); dfs2(1,0); for(int i=1,a,k; i<=m; i++){ read(a),read(k); LL ans=1ll*min(k,dep[a]-1)*(siz[a]-1) +query(root[dfn[a]+siz[a]-1],root[dfn[a]], 1,mxd,dep[a]+1,min(dep[a]+k,mxd)); printf("%lld\n",ans); } }
分类:
C 数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!