C64 可持久化线段树+DFS P3899 [湖南集训] 更为厉害

视频链接:250 可持久化线段树+DFS P3899 [湖南集训] 更为厉害_哔哩哔哩_bilibili

 

 

 

 

Luogu P3899 [湖南集训] 更为厉害

复制代码
#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);
  }
}
复制代码

 

posted @   董晓  阅读(151)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示