唉:-(动态点分治的思想真是复杂......

先码住,再做几道题再来填坑

PS:接下来的Code因为用了倍增lca所以TLE一部分,但是懒得改成RMQ了......

Code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,m,cnt,sum,root,first[],fa[],siz[],son[];
bool vis[]={};
ll dis1[],dis2[],tot[];
struct edge{
int to,next,w;
}a[];
void add(int u,int v,int w){
a[++cnt]=(edge){v,first[u],w};first[u]=cnt;
a[++cnt]=(edge){u,first[v],w};first[v]=cnt;
}
inline int _max(int l,int r){return (l>r)?l:r;}
inline int _min(int l,int r){return (l<r)?l:r;}
inline void _swap(int &l,int &r){l^=r;r^=l;l^=r;}
struct Original_Tree{
int cnt,First[],dis[],dep[];
int st[][];
struct Edge{int to,next,w;}A[];
void add(int u,int v,int w){
A[++cnt]=(Edge){v,First[u],w};First[u]=cnt;
A[++cnt]=(Edge){u,First[v],w};First[v]=cnt;
}
void ddfs(int u,int f){
st[u][]=f;int i,v;
//cout<<"dfs "<<u<<" "<<f<<" "<<dis[u]<<" "<<dep[u]<<"\n";
for(i=First[u];~i;i=A[i].next){
v=A[i].to;
if(v==f) continue;
dis[v]=dis[u]+A[i].w;dep[v]=dep[u]+;
ddfs(v,u);
}
}
void initst(){
dis[]=;dep[]=;ddfs(,);int i,j;
for(j=;j<;j++){
for(i=;i<=n;i++) st[i][j]=st[st[i][j-]][j-];
}
//for(i=1;i<=n;i++){
//for(j=0;j<=3;j++) cout<<st[i][j]<<" ";
//cout<<"\n";
//}
}
int getdis(int u,int v){
if(dep[u]>dep[v]) _swap(u,v);
int i,lca,tu=u,tv=v;
//cout<<"begin "<<u<<" "<<v<<"\n";
for(i=;i>=;i--)
if(dep[st[v][i]]>=dep[u]) v=st[v][i];
//cout<<"half finish "<<u<<" "<<v<<"\n";
if(u==v) return dis[tv]-dis[u];
for(i=;i>=;i--)
if(st[u][i]!=st[v][i]){
u=st[u][i];
v=st[v][i];
}
lca=st[u][];
//cout<<"getdis "<<tu<<" "<<tv<<" "<<lca<<"\n";
return dis[tu]+dis[tv]-*dis[lca];
}
}T;
void getroot(int u,int f){
int i,v;siz[u]=;son[u]=;
for(i=T.First[u];~i;i=T.A[i].next){
v=T.A[i].to;
if(v==f||vis[v]) continue;
getroot(v,u);
siz[u]+=siz[v];son[u]=_max(son[u],siz[v]);
}
son[u]=_max(son[u],sum-siz[u]);
if(son[u]<son[root]) root=u;
}
void dfs(int u,int f){
int i,v;vis[u]=;fa[u]=f;
for(i=T.First[u];~i;i=T.A[i].next){
v=T.A[i].to;
if(vis[v]) continue;
sum=siz[v];root=;
getroot(v,);add(u,root,v);
dfs(root,u);
}
}
void change(int u,int delta){
tot[u]+=delta;int v,dis;
for(v=u;fa[v];v=fa[v]){
dis=T.getdis(u,fa[v]);
dis1[fa[v]]+=(ll)dis*delta;
dis2[v]+=(ll)dis*delta;
tot[fa[v]]+=delta;
}
}
ll calc(int u){
ll re=dis1[u];int i,dis;
for(i=u;fa[i];i=fa[i]){
dis=T.getdis(u,fa[i]);
re+=dis1[fa[i]]-dis2[i];
re+=dis*(tot[fa[i]]-tot[i]);
}
return re;
}
ll query(int u){
ll re=calc(u),tmp;int i,v;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
tmp=calc(a[i].w);
if(tmp<re) return query(v);
}
return re;
}
int main(){
freopen("zjoi15_tree4.in","r",stdin);
freopen("zjoi15_tree.out","w",stdout); memset(tot,,sizeof(tot));
memset(dis1,,sizeof(dis1));
memset(dis2,,sizeof(dis2));
memset(first,-,sizeof(first));
memset(T.First,-,sizeof(T.First));
int i,t1,t2,t3,tmp;
n=read();m=read();
for(i=;i<n;i++){
t1=read();t2=read();t3=read();
T.add(t1,t2,t3);
}
T.initst();
sum=son[]=n;root=;
getroot(,);tmp=root;
dfs(root,);root=tmp;
for(i=;i<=m;i++){
t1=read();t2=read();
change(t1,t2);
printf("%lld\n",query(root));
}
}

[ZJOI2015][bzoj3924] 幻想乡战略游戏 [动态点分治]的更多相关文章

  1. loj 2135 「ZJOI2015」幻想乡战略游戏 - 动态点分治

    题目传送门 传送门 题目大意 给定一棵树,初始点权都为0,要求支持: 修改点权 询问带权重心 询问带权重心就在点分树上跑一下就行了.(枚举跳哪个子树更优) 剩下都是基础点分治. 学了一下11-dime ...

  2. 【BZOJ3924】[Zjoi2015]幻想乡战略游戏 动态树分治

    [BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...

  3. [ZJOI2015]幻想乡战略游戏——动态点分治

    [ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...

  4. [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)

    题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...

  5. 【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治

    题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打 ...

  6. P3345 [ZJOI2015]幻想乡战略游戏 动态点分治

    \(\color{#0066ff}{ 题目描述 }\) 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越 ...

  7. ZJOI2015 幻想乡战略游戏 动态点分治_树链剖分_未调完

    Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...

  8. BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)

    这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...

  9. 洛谷P3345 [ZJOI2015]幻想乡战略游戏 [动态点分治]

    传送门 调了两个小时,终于过了-- 凭啥人家代码80行我180行啊!!! 谁叫你大括号换行 谁叫你写缺省源 思路 显然,补给点所在的位置就是这棵树的带权重心. 考虑size已知时如何找重心:一开始设答 ...

随机推荐

  1. basic_double_stream_incorrect

    不合理的代码 /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. * * NVIDIA Corporation and ...

  2. 借鉴一些关于js框架的东西

    八款Js框架介绍及比较,Dojo .Scriptaculous .Prototype .yui-ext .Jquery .Mochikit.mootools .moo.fx,componentartu ...

  3. 关于JavaScript中的事件代理(例子:ul中无数的li上添加点击事件)

    面试题:一个ul中有一千个li,如何给这一千个li绑定一个鼠标点击事件,当鼠标点击时alert出这个li的内容和li的位置坐标xy. 看到这个题目,我们一般首先想到的思路是,for循环,遍历1000次 ...

  4. 【数学 随机 技巧】cf364D. Ghd

    随机化选讲的例题 John Doe offered his sister Jane Doe find the gcd of some set of numbers a. Gcd is a positi ...

  5. 3.Cisco Packet Tracer中关于交换机端口安全的设置

    本次实验将在这幅拓扑图的基础上完成 我们会对pc0在交换机上进行mac地址绑定,pc1访问时则交换机断开端口 1.为pc机配置ip地址 pc0:192.168.1.1 pc1:192.168.1.2 ...

  6. Android 性能篇 -- 带你领略Android内存泄漏的前世今生

    基础了解 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是指由程序分配的内存但是由于程序逻辑错误而导致程序失 ...

  7. 04.VUE学习之v-text v-html

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. TI C64X+通用库函数使用手册

    在使用前,当知悉以下几点: 函数进程由手动汇编而成,已充分发挥器件效率.同时TI对外提供C和线性汇编代码 对于个人一些特殊应用,DSPLIB可能会带来额外的cycle消耗 TI DSPLIB依平台和时 ...

  9. Jquery Dialog 详解(正在学习jquery,详解转载)

    文章来源:http://xufish.blogbus.com/logs/39583154.html AUTHOR:Jevoly 还是先看例子吧.另外如果要拖动.改变dialog的大小的话要加上ui.d ...

  10. Java中Scanner中nextLine()方法和next()方法的区别

    https://blog.csdn.net/hello_word2/article/details/54895106