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

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

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. iOS 常用正则表达式

    今天看到一个正则表达式的文章,总结的挺好的,就自己转载一下,我还会陆续加入一些我自己看到常用的正则表达式 (原地址:http://www.code4app.com/blog-721976-112.ht ...

  2. 2017.12.24 Java序列化你不知道的事(二)

    1 序列化允许重构 序列化允许一定数量的类变种,甚至重构之后也是如此,ObjectInputStream 仍可以很好地将其读出来. Java Object Serialization 规范可以自动管理 ...

  3. LigerUI的下拉框行和树的设置(表单生成)

    http://blog.csdn.net/dxnn520/article/details/8194767 // ---------------------- // [下拉树设置 -- 单选] {dis ...

  4. leetcode - 二叉树最大深度

    二叉树最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,nul ...

  5. 《JavaScript入门篇》摘要

    0.课程链接 http://www.imooc.com/learn/36 1.在HTML中加入JS的方法 <script type="text/javascript"> ...

  6. vue axios 攻略

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特点: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 ...

  7. (80)zabbix性能优化中的几个建议

    随着zabbix的广泛应用,少数人的zabbix服务器在性能上出现瓶颈,或者在未来会出现性能方面的瓶颈,接下来讨论几个有效并且简单的优化方案. 服务器硬件 想通过几个简单的配置让服务器提高成倍的性能, ...

  8. mysql安装记录

    一.创建mysql用户 useradd mysql 二.解压 tar -zxvf mysql-5.6.38.tar.gz 三.安装依赖包 yum install -y ncurses-devel li ...

  9. linux-最最最最最常用的操作

    去除两个文件中相同的内容 比如我想把file1中不含文件file2的内容保留下来:(这个在抠一些内容的时候挺好用的) awk '{print $0}' file1 file2 |sort|uniq - ...

  10. 笔记-python-standard library-19.2 json

    笔记-python-standard library-19.2 json 1.      JSON简介 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级 ...