解题:ZJOI 2015 幻想乡战略游戏

时间:2023-02-25 15:38:04

题面

神**所有点都爆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. &lbrack;ZJOI 2015&rsqb;幻想乡战略游戏

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

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

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

  3. 洛谷 P3345 &lbrack;ZJOI2015&rsqb;幻想乡战略游戏 解题报告

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

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

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

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

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

  6. LOJ &num;2135&period; 「ZJOI2015」幻想乡战略游戏

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

  7. &lbrack;ZJOI2015&rsqb;幻想乡战略游戏——动态点分治

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

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

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

  9. AC日记——&lbrack;ZJOI2015&rsqb;幻想乡战略游戏 洛谷 P3345

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

随机推荐

  1. iOS学习笔记-CoreData

    简介 CoreData提供了对象关系映射(ORM)功能,从效果上说就是创建了一个"虚拟对象数据库",也可以把它看作一个综合的数据库管理库. NSManagedObjectConte ...

  2. 关于 &period;crash 分析

    这里只给出其中 一种方式. 1. 建议 桌面 建 个文件夹  appxx  ,然后 将那个闪退 对应的 包  xxx.app 放入  appxx文件夹 2. 打开终端cd命令,进入该文件夹 3.在命令 ...

  3. http协议与web本质

    当你在浏览器地址栏敲入“http://www.csdn.net/”,然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是web开发人员,我想 ...

  4. java 中 &OpenCurlyDoubleQuote;文件” 和 &OpenCurlyDoubleQuote;流” 的简单分析

    java 中 FIle 和 流的简单分析 File类 简单File 常用方法 创建一个File 对象,检验文件是否存在,若不存在就创建,然后对File的类的这部分操作进行演示,如文件的名称.大小等 / ...

  5. 中文版microbit:TurnipBit显示动态滚动字符教程实例

    随着当今社会的发展,社会的进步,家长们越来越忙碌,致使家长们在孩子成长过程中陪孩子的互动的时间越来越少,为此,TurnipSmart公司制作的一款MicroPython开发板--TurnipBit,这 ...

  6. 51nod 1009 数字1的数量(数位dp模板)

    给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1.   数位dp的模板题   ...

  7. Google的java工具类Guava

    前言 google开发java项目肯定也不想重复造*,所以肯定也有工具类,就是它了:Guava 我将举例几个实际的例子,发挥这个工具类好用的功能.更多的方法和功能,还有内部的实现可以直接参考http ...

  8. Python【读写Json文件】

    indent=10:缩进10个空格

  9. java中的Lamdba表达式和Stream

    基于JDK 1.8 1.循环: // 以前的循环方式 for (String player : players) { System.out.print(player + "; ") ...

  10. Going Deeper with Convolutions&lpar;Inception v1&rpar;笔记

    目录 Abstract Introduction First of All Inception Depth Related Work Motivation and High Level Conside ...