解题:ZJOI 2015 幻想乡战略游戏
神**所有点都爆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 幻想乡战略游戏的更多相关文章
- [ZJOI 2015]幻想乡战略游戏
Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...
- ZJOI 2015 幻想乡战略游戏(动态点分治)
题意 https://loj.ac/problem/2135 思路 首先要明确一点,答案分布是有单调性的.什么意思呢?假设我们的答案在 \(u\) 节点,\((u,v)\) 之间有一条边且 \(u\) ...
- 洛谷 P3345 [ZJOI2015]幻想乡战略游戏 解题报告
P3345 [ZJOI2015]幻想乡战略游戏 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做 ...
- 【BZOJ3924】幻想乡战略游戏(动态点分治)
[BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...
- LOJ2135 「ZJOI2015」幻想乡战略游戏
题意 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和 ...
- LOJ #2135. 「ZJOI2015」幻想乡战略游戏
#2135. 「ZJOI2015」幻想乡战略游戏 链接 分析: 动态点分治,求加权重心,带修改. 考虑如果知道了一个点s,如何求答案,那么首先可以点分治的思想,求每个联通块内所有点到分治中心距离和,然 ...
- [ZJOI2015]幻想乡战略游戏——动态点分治
[ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...
- BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】
BZOJ3924 ZJOI2015 幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂 ...
- AC日记——[ZJOI2015]幻想乡战略游戏 洛谷 P3345
[ZJOI2015]幻想乡战略游戏 思路: 树剖暴力转移: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
随机推荐
- 转载:XGBOOST算法梳理
学习内容: CART树 算法原理 损失函数 分裂结点算法 正则化 对缺失值处理 优缺点 应用场景 sklearn参数 转自:https://zhuanlan.zhihu.com/p/58221959 ...
- Hyperledger Fabic中的Transaction流程
Hyperledger Fabic中的Transaction流程 Transaction处理流程时从client发起proposal到背书节点,背书节点发返回背书结果.client再将proposal ...
- Oracle purge 用法介绍
http://blog.csdn.net/indexman/article/details/27379597
- 面向对象OO第9-11次作业总结
面向对象OO第9-11次作业总结 1.关于规格化设计的调研程序规格说明:对程序所应满足的要求,以可验证的方式作出完全.精确陈述的文件.“规格说明”一词与其他工业产品的“规格说明书”有相似的含义.不过, ...
- iOS自学-混合编程
OC调用swift,引入头文件 #improt "工程名字-swift.h" swift调用OC,在桥梁文件里面引入OC文件 的头文件 尽情混合编程吧...
- HDU 4281 Judges' response 状压dp+多旅行商问题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4281 Judges' response Time Limit: 2000/1000 MS (Java ...
- 第一个spring冲刺第二天
讨论成员:王俊凯.罗凯杰.王逸辉.马志磊 地点:宿舍 话题:讨论关于安卓的控件的应用和如何调用 选题:四则运算 方向:更加实用的计算器功能,功能更加实用并且简单,没有太多的繁琐操作,可以的话会加上些趣 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.16
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据老师的要求将项目划分成一系列小任务.③:在上次会议内容完成的基础上增加新的任务. 2.每个人的工作 ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (五) 树莓派单子节点发送数据
本项目中各个节点和树莓派的通信不区分信道,因此如果由树莓派发送给特定节点的数据会被所有节点接收到,因此子节点可以判别该数据是否发给自己的,需要在数据的第二个字节中加入目标节点的编号(第一个字节为源节点 ...
- 关于SVM数学细节逻辑的个人理解(二):从基本形式转化为对偶问题
第二部分:转化为对偶问题进一步简化 这一部分涉及的数学原理特别多.如果有逻辑错误希望可以指出来. 上一部分得到了最大间隔分类器的基本形式: 其中i=1,2,3...m 直接求的话一看就很复杂,我们 ...