题面

神**所有点都爆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. Java 快排 排序

    一.快排的一种 ==================== public class myMain { public static void main(String[] args) { int t[] ...

  2. 从零开始的Python学习Episode 23——进程

    ---恢复内容开始--- 进程 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用 ...

  3. RHEL6.4 xclock安装小记

    http://blog.sina.com.cn/s/blog_623630d50101tc67.html

  4. "Hello World!"团队负责人领跑衫感言

    时间:2017年12月7日 团队名称:“Hello World!” 团队项目:空天猎 团队成员:陈建宇(项目负责人).刘淑霞.黄泽宇.方铭.贾男男.刘耀泽.刘成志 感言正文: 记<软件工程> ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 第11章 二叉查找树 一.概述 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子 ...

  6. linux下创建virtualenv时指定python版本

    virtualenv是python开发中一个重要的工具,它可以帮助我们创建一个干净的python解释环境,创建虚拟环境时,这个虚拟环境的python版本往往是系统默认的2.x版本.别急,我们只需要一条 ...

  7. 项目Beta冲刺(团队)第四天

    1.昨天的困难 返回提问者昵称的时候返回信息不全,个别信息没有返回过去 一开始ProgressBar控件的显示有问题 需要实现类似聊天的功能,采用listview承载聊天内容,对于自定义适配器的构建使 ...

  8. python learning Regular Expression.py

    # 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规 ...

  9. 项目冲刺Beta第二篇博客

    Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060  排行榜界面美化 陈敬轩059  注册成功界面美化 黄兴067  登录界面美化 林国梽068  答题界 ...

  10. 未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件

    发布的打包项目在本机测试好使,部署到客户服务器上报错 分析器错误消息: 未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Cu ...