虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树.

写完+调完总共花了不到 $50$ 分钟,感觉还行.

code:

#include <bits/stdc++.h>
#define N 420004
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
namespace IO
{
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
};
int n,K,edges;
int hd[N],nex[N<<1],val[N<<1],to[N<<1],F[N],G[N];
inline void add(int u,int v,int c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
struct tree
{
LL dis[N];
int size[N],son[N],top[N],fa[N],dep[N];
void dfs1(int u,int ff)
{
fa[u]=ff,dep[u]=dep[ff]+1,size[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dis[v]=dis[u]+val[i];
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
if(son[u]) dfs2(son[u],tp);
for(int i=hd[u];i;i=nex[i])
if(to[i]!=fa[u]&&to[i]!=son[u]) dfs2(to[i],to[i]);
}
inline int LCA(int x,int y)
{
while(top[x]!=top[y])
{
dep[top[x]]>dep[top[y]]?x=fa[top[x]]:y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
inline LL Dis1(int x,int y)
{
return dis[x]+dis[y]-(dis[LCA(x,y)]<<1);
}
inline LL Dis2(int x,int y)
{
return dep[x]+dep[y]-(dep[LCA(x,y)]<<1);
}
}tree;
struct seg
{
int tot;
inline void init() { tot=0;}
inline int newnode() { return ++tot; }
struct node
{
int ls,rs,s2;
LL sum;
}t[N*20];
void update(int &x,int l,int r,int p,LL v)
{
if(!x) x=newnode();
t[x].sum+=v;
t[x].s2++;
if(l==r) return;
int mid=(l+r)>>1;
if(p<=mid) update(t[x].ls,l,mid,p,v);
else update(t[x].rs,mid+1,r,p,v);
}
LL query(int x,int l,int r,int L,int R)
{
if(!x) return 0;
if(l>=L&&r<=R) return t[x].sum;
int mid=(l+r)>>1;
LL re=0ll;
if(L<=mid) re+=query(t[x].ls,l,mid,L,R);
if(R>mid) re+=query(t[x].rs,mid+1,r,L,R);
return re;
}
int q2(int x,int l,int r,int L,int R)
{
if(!x) return 0;
if(l>=L&&r<=R) return t[x].s2;
int mid=(l+r)>>1,re=0;
if(L<=mid) re+=q2(t[x].ls,l,mid,L,R);
if(R>mid) re+=q2(t[x].rs,mid+1,r,L,R);
return re;
}
}seg;
struct opt
{
int root,sn;
int Fa[N],size[N],vis[N],mx[N];
void getroot(int u,int ff)
{
size[u]=1,mx[u]=0;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff||vis[v]) continue;
getroot(v,u);
size[u]+=size[v];
mx[u]=max(mx[u], size[v]);
}
mx[u]=max(mx[u], sn-size[u]);
if(mx[u]<mx[root]) root=u;
}
void calc(int pp,int u,int lst,int ff,int dep,LL w)
{
if(dep<=K) seg.update(F[pp],0,K,dep,w);
if(ff)
{
LL tmp2=tree.Dis1(u,ff);
int tmp1=tree.Dis2(u,ff);
if(tmp1<=K) seg.update(G[pp],0,K,tmp1,tmp2);
}
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(vis[v]||v==lst) continue;
calc(pp,v,u,ff,dep+1,w+1ll*val[i]);
}
}
void dfs(int u)
{
vis[u]=1;
calc(u,u,0,Fa[u],0,0ll);
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(vis[v]) continue;
root=0,sn=size[v],getroot(v,u),Fa[root]=u,dfs(root);
}
}
LL getdis(int u)
{
LL tmp=seg.query(F[u],0,K,0,K);
int U=u;
for(;Fa[u];u=Fa[u])
{
int tt=tree.Dis2(U,Fa[u]);
if(tt<=K)
{
LL a=seg.query(F[Fa[u]],0,K,0,K-tt)-seg.query(G[u],0,K,0,K-tt);
LL b=seg.q2(F[Fa[u]],0,K,0,K-tt)-seg.q2(G[u],0,K,0,K-tt);
tmp+=a+b*tree.Dis1(U,Fa[u]);
}
}
return tmp;
}
void solve()
{
root=0;
mx[0]=sn=n;
getroot(1,0);
dfs(root);
int i,j;
for(i=1;i<=n;++i)
{
// getdis(i);
printf("%lld ",getdis(i));
}
}
}opt;
int main()
{
// setIO("input");
using namespace IO;
int i,j;
n=rd(),K=rd();
// scanf("%d%d",&n,&K);
for(i=1;i<n;++i)
{
int x,y,c;
x=rd(),y=rd(),c=rd();
add(x,y,c),add(y,x,c);
}
tree.dfs1(1,0);
tree.dfs2(1,1);
seg.init();
opt.solve();
return 0;
}

  

计蒜客模拟赛 #5 (B 题) 动态点分治+线段树的更多相关文章

  1. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  2. 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp

    题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...

  3. 计蒜客模拟赛D1T3 蒜头君的坐骑:用dfs转移dp

    题目链接:https://nanti.jisuanke.com/t/16447 题意: 蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要 ...

  4. 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组

    题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...

  5. 计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂

    题目链接:https://nanti.jisuanke.com/t/16442 题意: 有个人在第一年送了你一对1岁的兔子.这种兔子刚生下来的时候算0岁,当它在2~10岁的时候,每年都会生下一对兔子, ...

  6. 计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和

    题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度 ...

  7. 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和

    题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...

  8. 计蒜客模拟赛5 D2T2 蚂蚁搬家

    很久很久以前,有很多蚂蚁部落共同生活在一片祥和的村庄里.但在某一天,村庄里突然出现了一只食蚁兽,蚂蚁们为了保全性命而决定搬家. 然而这个村庄四面环山,想要离开这个村庄必须要从地洞里离开,村子里一共有 ...

  9. 2019ICPC上海网络赛 A Lightning Routing I 点分树(动态点分治)+线段树

    题意 给一颗带边权的树,有两种操作 \(C~e_i~w_i\),将第\(e_i\)条边的边权改为\(w_i\). \(Q~v_i\),询问距\(v_i\)点最远的点的距离. 分析 官方题解做法:动态维 ...

随机推荐

  1. MySQL运维中的Tips--持续更新

    1.into outfile 生成sql:一般都是生成文本或者其他形式的文件,现在需要生成sql形式的文件.配置文件加secure_file_priv=''select concat('insert ...

  2. 深入Java中的位操作

    「WTF系列」深入Java中的位操作 关于WTF系列 引 学完本章节你将学会位的基础概念与语法,并且还会一些骚操作!! 与.或.非.位移 原码.反码.补码 字节.位.超区间...... 开始本章节之前 ...

  3. Scala 函数入门之默认参数和带名参数

    Scala 默认参数 在Scala中,有时我们调用某些函数时,不希望给出参数的具体值,而希望使用参数自身默认的值,此时就定义在定义函数时使用默认参数. def sayHello(firstName: ...

  4. change事件传值方式 data-set 以及复杂数据类型 可以动态创建对象push到数组里面

    <template>   <div>     <!-- <div class="banner">       <a-breadcru ...

  5. MediaPlayer的prepareAsync不回调onPrepared问题

    一.问题排查 debug调试的framework日志信息: 根据日志,进入MediaPlayer的framework层看源码 STEP 1 先从 V/MediaPlayerNative: constr ...

  6. (转)Nginx+rtmp+ffmpeg搭建流媒体服务器

    (1)下载第三方扩展模块nginx-rtmp-module # mkdir module && cd module //创建一个存放模块的目录 # wget https://githu ...

  7. Nginx限制访问速率和最大并发连接数模块--limit (防范DDOS攻击)

    Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/document_cn/http_limit_req_cn ...

  8. 成员函数内定义static变量(不安全,各对象之间共享)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012317833/article/de ...

  9. 查看线程CPU利用率

    查看线程CPU利用率 方法1:利用ps命令查看对应的线程 1. ps -ef | grep 进程名称 2. ps -mp 进程ID -o THREAD,pid,tid,cmd,time,%cpu,%m ...

  10. python day5 lambda,内置函数,文件操作,冒泡排序以及装饰器

    目录 python day 5 1. 匿名函数lambda 2. python的内置函数 3. python文件操作 4. 递归函数 5. 冒泡排序 6. 装饰器 python day 5 2019/ ...