题面

神**所有点都爆int,我还以为我写出什么大锅了,不开long long见祖宗。。。

动态点分治利用点分树树高不超过log的性质,我们对每个点维护一个子树和,一个点分树子树和,一个点分树上父亲的子树和。修改直接爬点分树,查询在点分树上往答案较小的儿子上跳,如果儿子都不如自己优说明自己就是最优的

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,inf=1e9;
int n,c,T,t1,t2,t3,cnt,Cnt,sizz;
int p[N],noww[*N],goal[*N],val[*N];
int siz[N],dep[N],far[N],imp[N],top[N],dis[N];
int P[N],Noww[*N],Goal[*N],Val[*N];
int sze[N],maxx[N],vis[N],fer[N];
long long sum[N],dst[N][];
void Link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v;
noww[++cnt]=p[t],p[t]=cnt;
goal[cnt]=f,val[cnt]=v;
}
void Linka(int f,int t,int v)
{
Noww[++Cnt]=P[f],P[f]=Cnt;
Goal[Cnt]=t,Val[Cnt]=v;
Noww[++Cnt]=P[t],P[t]=Cnt;
Goal[Cnt]=f,Val[Cnt]=v;
}
void DFS(int nde,int fth,int dth)
{
int tmp=;
siz[nde]=,far[nde]=fth,dep[nde]=dth;
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
{
dis[goal[i]]=dis[nde]+val[i];
DFS(goal[i],nde,dth+);
siz[nde]+=siz[goal[i]];
if(siz[goal[i]]>tmp)
tmp=siz[goal[i]],imp[nde]=goal[i];
}
}
void Gettop(int nde,int tpp)
{
top[nde]=tpp;
if(imp[nde])
{
Gettop(imp[nde],tpp);
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=far[nde]&&goal[i]!=imp[nde])
Gettop(goal[i],goal[i]);
}
}
int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y); x=far[top[x]];
}
return dep[x]<dep[y]?x:y;
}
long long Dist(int x,int y)
{
int lca=LCA(x,y);
return dis[x]+dis[y]-*dis[lca];
}
void Mark(int nde,int fth)
{
sze[nde]=,maxx[nde]=;
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth&&!vis[goal[i]])
{
Mark(goal[i],nde);
sze[nde]+=sze[goal[i]];
maxx[nde]=max(maxx[nde],sze[goal[i]]);
}
maxx[nde]=max(maxx[nde],sizz-sze[nde]);
if(maxx[nde]<maxx[c]) c=nde;
}
void Create(int nde,int fth)
{
vis[nde]=true,fer[nde]=fth;
for(int i=p[nde];i;i=noww[i])
if(!vis[goal[i]])
{
sizz=sze[goal[i]],maxx[c=]=sze[goal[i]];
Mark(goal[i],),Linka(nde,c,goal[i]),Create(c,nde);
}
}
void Change(int nde,int tsk)
{
sum[nde]+=tsk; int mem=nde;
while(fer[nde])
{
long long dist=Dist(fer[nde],mem)*tsk;
dst[fer[nde]][]+=dist,dst[nde][]+=dist;
sum[fer[nde]]+=tsk,nde=fer[nde];
}
}
long long Getans(int nde)
{
long long ret=dst[nde][]; int mem=nde;
while(fer[nde])
{
long long dist=Dist(fer[nde],mem);
ret+=dst[fer[nde]][]-dst[nde][];
ret+=dist*(sum[fer[nde]]-sum[nde]);
nde=fer[nde];
}
return ret;
}
long long Query(int nde)
{
long long ret=Getans(nde);
for(int i=P[nde];i;i=Noww[i])
if(Getans(Val[i])<ret)
return Query(Goal[i]);
return ret;
}
int main()
{
scanf("%d%d",&n,&T);
for(int i=;i<n;i++)
scanf("%d%d%d",&t1,&t2,&t3),Link(t1,t2,t3);
DFS(,,),Gettop(,);
sizz=n,maxx[c=]=n,Mark(,);
int mem=c; Create(c,),c=mem;
while(T--)
{
scanf("%d%d",&t1,&t2);
Change(t1,t2),printf("%lld\n",Query(c));
}
return ;
}

解题:ZJOI 2015 幻想乡战略游戏的更多相关文章

  1. [ZJOI 2015]幻想乡战略游戏

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

  2. ZJOI 2015 幻想乡战略游戏(动态点分治)

    题意 https://loj.ac/problem/2135 思路 首先要明确一点,答案分布是有单调性的.什么意思呢?假设我们的答案在 \(u\) 节点,\((u,v)\) 之间有一条边且 \(u\) ...

  3. 洛谷 P3345 [ZJOI2015]幻想乡战略游戏 解题报告

    P3345 [ZJOI2015]幻想乡战略游戏 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做 ...

  4. 【BZOJ3924】幻想乡战略游戏(动态点分治)

    [BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...

  5. LOJ2135 「ZJOI2015」幻想乡战略游戏

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

  6. LOJ #2135. 「ZJOI2015」幻想乡战略游戏

    #2135. 「ZJOI2015」幻想乡战略游戏 链接 分析: 动态点分治,求加权重心,带修改. 考虑如果知道了一个点s,如何求答案,那么首先可以点分治的思想,求每个联通块内所有点到分治中心距离和,然 ...

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

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

  8. BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】

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

  9. AC日记——[ZJOI2015]幻想乡战略游戏 洛谷 P3345

    [ZJOI2015]幻想乡战略游戏 思路: 树剖暴力转移: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

随机推荐

  1. python3去除字符串中括号及括号里面的内容

    a = """ <option value="search-alias=arts-crafts-intl-ship">Arts & ...

  2. 精通Python爬虫-03-狩猎大师

    声明: 本系列文章原创于慕课网,作者秋名山车神,任何人不得以任何形式在不经作者允许的情况下,进行任何形式的印刷以及销售,转载需注明出处及此声明. 本系列文章更新至少每周一更,将涉及Python爬虫基础 ...

  3. 原生JavaScript实现的贪吃蛇

    github代码地址:https://github.com/McRayFE/snake 涉及到的知识点: 键盘事件 setInterval()定时器 javascript中数组的使用 碰撞的检测 of ...

  4. TeamWork#3,Week5,Scrum Meeting 11.13

    最近我们根据之前发现的问题, 补充了相关知识,正在努力修复出现的问题,调整程序结构. 成员 已完成 待完成 彭林江 之前没有考虑到网站信息更新导致的程序可变性,正在调整爬虫程序结构 更换爬虫结构 郝倩 ...

  5. 20162328蔡文琛 week05 大二

    20162328 2017-2018-1 <程序设计与数据结构>第5周学习总结 教材学习内容总结 集合是收集元素并组织其他对象的对象. 集合中的元素一般由加入集合的次序或元素之间的某些固有 ...

  6. 《找出1到正整数N中出现1的次数》

    <找出1到正整数N中出现1的次数> 编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果:而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对 ...

  7. Linux系统(X32)安装Oracle11g完整安装图文教程另附基本操作

    一.修改操作系统核心参数 在Root用户下执行以下步骤: )修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/limi ...

  8. JAVA对象的初始化过程

    出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输 ...

  9. Week2-作业1——关于阅读《构建之法》第1、2、16章的疑问与感悟

    关于阅读<构建之法>第1.2.16章的疑问与感悟 术语解释: 第2章,23页 什么是代码覆盖率? ———————————————————— 在测试中的代码覆盖率是指,你运行测试用例后,走过 ...

  10. 23_IO_第23天(字节流、字符流)_讲义

    今日内容介绍 1.字节流 2.字符流 01输入和输出 * A:输入和输出 * a: 参照物 * 到底是输入还是输出,都是以Java程序为参照 * b: Output * 把内存中的数据存储到持久化设备 ...