题解 P3345 [ZJOI2015] 幻想乡战略游戏
点分树。
本题的核心问题在于不好直接确定补给站的位置。
但是仔细思考后我们发现,对于当前节点,如果存在一个儿子的答案比它优,那么补给站一定在那个儿子的子树中。
增量为 。当 优于 时,。如果 也满足,则 ,不符合条件,所以一定唯一。
又发现这棵树上的点的度数都不超过 ,所以可以暴力递归,暴力跳,暴力算。复杂度 。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,q,tot,rt,siz[N],f[N],fa[N],pre[N],vis[N];
struct node{int v,w;node(int v=0,int w=0):v(v),w(w){}};
vector<node>adj[N];
vector<int>vec[N];
unordered_map<int,ll>dis[N];
void getg(int u,int lst){
siz[u]=1;f[u]=0;
for(int i=0;i<adj[u].size();++i){
int v=adj[u][i].v;if(v==lst||vis[v])continue;
getg(v,u);siz[u]+=siz[v];f[u]=max(f[u],siz[v]);
}
f[u]=max(f[u],tot-siz[u]);
if(f[u]<f[rt])rt=u;
}
void cal(int u,int lst,int tt){
for(int i=0;i<adj[u].size();++i){
int v=adj[u][i].v,w=adj[u][i].w;if(v==lst||vis[v])continue;
dis[tt][v]=dis[tt][u]+w;cal(v,u,tt);
}
}
int build(int u,int s){
rt=0;tot=s;dis[u][u]=0;getg(u,0);
int g=rt;vis[g]=1;dis[g][g]=0;cal(g,0,g);
for(int i=0;i<adj[g].size();++i){
int v=adj[g][i].v;if(vis[v])continue;
int tmp=build(v,s-f[v]);
vec[g].push_back(tmp);fa[tmp]=g;pre[tmp]=v;
}
return g;
}
ll d[N],s1[N],s2[N];
void update(int u,int c){
for(int i=u;i;i=fa[i]){
d[i]+=c;
s1[i]+=c*dis[i][u];
if(fa[i])s2[i]+=c*dis[fa[i]][u];
}
}
ll get(int u){
ll res=s1[u];
for(int i=u;fa[i];i=fa[i])res+=s1[fa[i]]-s2[i]+dis[fa[i]][u]*(d[fa[i]]-d[i]);
return res;
}
ll query(int u){
ll res=get(u);
for(int i=0;i<vec[u].size();++i){
int v=vec[u][i];
if(get(pre[v])<res)return query(v);
}
return res;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<n;++i){
int u,v,w;cin>>u>>v>>w;
adj[u].push_back(node(v,w));adj[v].push_back(node(u,w));
}
f[0]=1e9;
rt=build(1,n);
while(q--){
int u,c;cin>>u>>c;
update(u,c);
cout<<query(rt)<<endl;
}
return 0;
}
本文作者:HQJ2007
本文链接:https://www.cnblogs.com/HQJ2007/p/17561383.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具