因为时间关系,就先强行明白了

dt点分治是接触过最难懂的东西了(可能是这一个题)

就是建立一颗点分树

注意子树向重心连边,修改时直接往上跳,用过点和不过点可以简单容斥

就知道这些了

码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
#define N 300000
int xia[N],zhong[N],v[N],hou[N],xia2[N],zhong2[N],v2[N],hou2[N],dui[N],dis[N],sz[N],max1;
LL d1[N],d2[N],he[N];
int n,m,i,tot,xh[N],tot2,rt,fu[N],mn[N][25],cnt,log[N],q,a,b,c;
bool vis[N];void jia(int a,int b,int c)
{++tot,hou[tot]=xia[a],xia[a]=tot,zhong[tot]=b,v[tot]=c;
}
void jian(int a,int b,int c)
{jia(a,b,c);jia(b,a,c);
}void jian2(int a,int b,int c)//建立原路径关系
{
++tot2,zhong2[tot2]=b;xh[tot2]=c,hou2[tot2]=xia2[a],xia2[a]=tot2;
}void zzx(int o,int fa)
{sz[o]=1;int maxx=0;for(int i=xia[o];i!=-1;i=hou[i]){int nd=zhong[i];if(nd==fa||vis[nd])continue;zzx(nd,o);sz[o]+=sz[nd];maxx=max(maxx,sz[nd]);      }maxx=max(maxx,tot-sz[o]);if(maxx<max1)max1=maxx,rt=o;
}void work(int o,int fa)
{vis[o]=1; fu[o]=fa;//js(o,fa);for(int i=xia[o];i!=-1;i=hou[i]){int nd=zhong[i];if(vis[nd])continue;tot=sz[nd];max1=99999999;zzx(nd,o);jian2(o,rt,zhong[i]);work(rt,o);}
}void dfs(int o,int fa,int d)//tarjan   lca
{mn[++cnt][0]=d;dui[o]=cnt;dis[o]=d;for(int i=xia[o];i!=-1;i=hou[i]){int nd=zhong[i];if(nd==fa)continue;dfs(nd,o,d+v[i]);mn[++cnt][0]=d;}}
int dist(int x,int y) {//原树距离 int ans=dis[x]+dis[y],k; x=dui[x];y=dui[y];if(x>y) swap(x,y);//对应dfs序k=log[y-x+1];return ans-min(mn[x][k],mn[y-(1<<k)+1][k])*2;
}void add(int x,int v) {he[x]+=v;//x为原树上点 for(int i=x;fu[i];i=fu[i]) {//跳点分树父亲  到  当前点 int d=dist(fu[i],x);//两个点的原树距离 d1[fu[i]]+=(LL)d*v;//d1为子树权值距离 d2[i]+=(LL)d*v;//d2为子节点到根权值距离 he[fu[i]]+=v;}
}
LL cal(int x) {LL ret=d1[x];for(int i=x;fu[i];i=fu[i]) {int d=dist(fu[i],x);//原树上距离 ret+=d1[fu[i]]-d2[i];//原树上距离差  ret+=d*(he[fu[i]]-he[i]);//统计这一块时差分 }return ret;
}
LL query(int x) {LL ans=cal(x);//直接找答案 for(int i=xia2[x];i!=-1;i=hou2[i]) {LL tmp=cal(xh[i]);if(tmp<ans) return query(zhong2[i]);}return ans;
}int main()
{memset(xia,-1,sizeof(xia));memset(xia2,-1,sizeof(xia2));scanf("%d%d",&n,&q);for(i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);jian(a,b,c);}dfs(1,0,0);log[0]=-1;for(int i=1;i<=cnt;i++) log[i]=log[i>>1]+1;//算2的log for(int j=1;(1<<j)<=cnt;j++)for(int i=1;i+(1<<j)-1<=cnt;i++)mn[i][j]=min(mn[i][j-1],mn[i+(1<<j-1)][j-1]);tot=n;max1=99999999;zzx(1,0);//    vis[1]=1;//cout<<rt;int t=rt;work(rt,0);rt=t;for(i=1;i<=q;i++){scanf("%d%d",&a,&b);add(a,b);printf("%lld\n",query(rt));}    } 

2017.7.26 幻想乡战略游戏 失败总结相关推荐

  1. P3345 [ZJOI2015]幻想乡战略游戏

    P3345 [ZJOI2015]幻想乡战略游戏 带修改带权重心 这是经典的树上寻找关键点的题目,我们使用点分治处理这个问题,因为点分治的特性,就相当于在树上二分了.但是这与倍增不同,倍增只是在链上二分 ...

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

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

  3. [ZJOI2015] 幻想乡战略游戏——树链剖分

    [ZJOI2015]幻想乡战略游戏 题解 由于所有边的边权是正整数,所以可以发现任何时刻每个点的答案是从最优的点往周围递增的.如果有平台,那么一定是在最优点的连通块那儿. 我们先考虑如何快速求每个点的 ...

  4. Bzoj3924 [Zjoi2015]幻想乡战略游戏

    Time Limit: 100 Sec  Memory Limit: 256 MB Submit: 817  Solved: 376 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏 ...

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

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

  6. luogu_P3345[zjoi2015]幻想乡战略游戏

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

  7. [zjoi2015]幻想乡战略游戏

    前言 略略略 题目相关 链接 题目大意 给出一棵树,每次修改一个点的权值,维护一个带权重心 啥是带权重心? 设点iii的值为ViV_iVi​我们要选一个点uuu,每个点对应一个值: ∑v=1nVv∗d ...

  8. BZOJ3924 : [Zjoi2015]幻想乡战略游戏

    对于一个点,要求出它到所有点的带权距离和,只需记录下树分治的结构然后查询即可. 修改$O(\log n)$,查询$O(\log n)$. 到所有点带权距离和最小的点显然是这棵树的带权重心. 以1号点为 ...

  9. 【ZJOI2015】幻想乡战略游戏【点分树】【带权重心】

    题意:nnn个点带边权的树,动态修改点权viv_ivi​,最小化 钦定一个点xxx 后 ∑idist(x,i)∗vi\sum\limits_{i} dist(x,i)*v_ii∑​dist(x,i)∗ ...

最新文章

  1. Recyclerview设置间距
  2. 如何使用JavaScript更改元素的类?
  3. python 数据分析学习笔记 (第三章)
  4. lucene之创建索引代码
  5. 华南理工大学和浙大计算机学院,浙江大学和华南理工大学的办学实力比较
  6. 20131127-正则表达式
  7. 扩大VMware虚拟机中linux硬盘空间
  8. 7500 cpuz跑分 i5_核心硬盘 i5 7500性能测试_DIY攒机酷品测试-中关村在线
  9. php 导航栏链接网页,怎样用php来给网页做导航栏_php实例
  10. r语言提取列名_玩转数据处理120题之P1-P20(R语言tidyverse版本)
  11. 有36匹马,六个跑道。没有记时器等设备,用最少的比赛次数算出跑的最快的前3匹马
  12. 跟我学习dubbo-简介(1)
  13. 淘宝双11大数据分析(Spark 分析篇)
  14. linux下openvpn服务搭建
  15. 蛙蛙推荐:蛙蛙教你解析网络包
  16. mapbox一学就会系列:01 第一个地图页面
  17. javascript的V8引擎的初步使用
  18. The missing quarter of a million 消失的25万 | 经济学人20230311版社论高质量双语精翻
  19. org.apache.jasper.JasperException: 无法在web.xml或uri:http://java.sun.com/jsp/jstl/core]
  20. 批量插入数据表数据时,主键冲突的解决

热门文章

  1. java filter注入_如何在Java Filter 中注入 Service
  2. 红橙Darren视频笔记 手写ButterKnife(Android Studio4.2.2 gradle-6.7.1 )
  3. 红橙Darren视频笔记 CoordinatorLayout:实现自定义behavior
  4. Android 播放SD卡视频 Demo
  5. BroadcastReceiver之动态广播 demo+笔记
  6. 机器学习中各科目基本概念集合
  7. c++ 设置类型别名
  8. matlab取矩阵实部和虚部,MATLAB中容易忽略却经常遇到的小技巧总结
  9. alias cli3 配置_vue-cli3项目搭建配置以及性能优化
  10. day17 Java的object中常见的方法以及内部类