题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3924

参考了博客:https://blog.csdn.net/qq_34564984/article/details/53791482

然后感觉这题其实是很好想的,为了计算答案而维护答案、权值和以及到父亲的答案;

只要记三个数即可,实现起来也不麻烦;

查询时可以利用性质(感性理解是对的),枚举原树上的20条出边,哪里更优走哪里;

为了减少走的次数,每次走到那个出边所在分治块的 rt 即可,这个 rt 一定是原来点在分治树上的一个儿子,因为不会走回父亲(原本就是从父亲走来的,走回去显然不优);

复杂度算一算应该是 m*20*log2n 的,过不了...?但这题给了 100s 的时限,怎么也过了。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=1e5+;
int n,hd[xn],ct,to[xn<<],nxt[xn<<],w[xn<<],tt[xn<<];
int siz[xn],dep[xn],fa[xn][],dis[xn][],son[xn][],num[xn],mx,rt;
ll f[xn],sum[xn],g[xn];
bool vis[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Max(int x,int y){return x>y?x:y;}
int Min(int x,int y){return x<y?x:y;}
void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct; w[ct]=z;}
void getrt(int x,int ff,int sum)
{
int nmx=; siz[x]=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff||vis[u])continue;
getrt(u,x,sum); siz[x]+=siz[u];
nmx=Max(nmx,siz[u]);
}
nmx=Max(nmx,sum-siz[x]);
if(nmx<mx)mx=nmx,rt=x;
}
void build(int x,int ff,int d)
{
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff||vis[u])continue;
fa[u][++dep[u]]=rt; dis[u][dep[u]]=d+w[i];
build(u,x,d+w[i]);
}
}
void work(int x,int sum)
{
vis[x]=; build(x,,);
for(int i=hd[x],u;i;i=nxt[i])
{
if(vis[u=to[i]])continue;
int ns=(siz[u]>siz[x]?sum-siz[x]:siz[u]);
mx=xn; getrt(u,,ns); tt[i]=rt; work(rt,ns);//tt
}
}
void change(int x,ll v)
{
for(int i=dep[x];i;i--)
{
int ff=fa[x][i],d=dis[x][i];
f[ff]+=v*d; sum[ff]+=v;
if(i>)g[ff]+=v*dis[x][i-];
}
}
ll cal(int x)
{
ll ret=;
for(int i=dep[x];i;i--)
{
int nw=fa[x][i]; ret+=f[nw]; ret-=g[nw];
if(i>)ret+=(sum[fa[x][i-]]-sum[nw])*dis[x][i-];
}
return ret;
}
ll query(int x)
{
ll val=cal(x);
//for(int i=1,u;i<=num[x];i++)
//if(cal(u=son[x][i])<val)return query(u);
for(int i=hd[x],u;i;i=nxt[i])
if(cal(u=to[i])<val)return query(tt[i]);
return val;
}
int main()
{
n=rd(); int m=rd();
for(int i=,x,y,z;i<n;i++)
x=rd(),y=rd(),z=rd(),add(x,y,z),add(y,x,z);
mx=xn; getrt(,,n); int yrt=rt; work(rt,n);
//for(int i=1,ff;i<=n;i++)son[ff=fa[i][dep[i]]][++num[ff]]=i;
for(int i=;i<=n;i++)fa[i][++dep[i]]=i;
for(int i=,x,v;i<=m;i++)
{
x=rd(); v=rd(); change(x,v);
printf("%lld\n",query(yrt));
}
return ;
}

bzoj 3924 幻想乡战略游戏 —— 动态点分治的更多相关文章

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

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

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

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

  3. BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)

    这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...

  4. bzoj 3924 幻想乡战略游戏

    题目大意: 有边权点权的树,动态修改点权 每次修改后求带权重心x (\(minimize\) \(S=\sum_i val[i]*dist[x][i]\)) 分析: 从暴力找突破口: 对于边x,y,设 ...

  5. [BZOJ3924][ZJOI2015]幻想乡战略游戏(动态点分治)

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

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

    \(\color{#0066ff}{ 题目描述 }\) 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越 ...

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

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

  8. ZJOI2015 幻想乡战略游戏 动态点分治_树链剖分_未调完

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

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

    唉:-(动态点分治的思想真是复杂...... 先码住,再做几道题再来填坑 PS:接下来的Code因为用了倍增lca所以TLE一部分,但是懒得改成RMQ了...... Code: #include< ...

随机推荐

  1. java web Listener的简单使用案例

    1.web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...

  2. 九度OJ 1323:World Cup Betting(世界杯) (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:492 解决:219 题目描述: With the 2010 FIFA World Cup running, football fans th ...

  3. 九度OJ 1000:计算a+b

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:35767 解决:15660 题目描述: 求整数a,b的和. 输入: 测试案例有多行,每行为a,b的值. 输出: 输出多行,对应a+b的结果. ...

  4. ASP跳出FOR循环

    由于ASP不能使用GOTO语句,我在FOR循环中加入一个FOR循环,若需要跳出,即退出最里面那个FOR循环. DEMO: <%dim aa = 0for i = 1 to 10    for j ...

  5. 洛谷 P2486 [SDOI2011]染色

    题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...

  6. vue项目创建流程和使用

    vue项目的创建 npm run dev 让项目执行起来 #下载vuex npm install vuex --save#下载axiosnpm install axios --save 当我们生成项目 ...

  7. 移动端web常见问题解决方案

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对i ...

  8. python基础22------python基础之基于tcp和udp的套接字

    一.TCP套接字 1.low版tcp套接字 服务器端 客户端 2.改进版tcp套接字 服务端 客户端 二.UDP的套接字 服务器 客户端 注:udp的套接字可以支持多个客户端同时访问,但tcp套接字就 ...

  9. 改善程序与设计的55个具体做法 day2

    条款05:了解C++默默编写并调用哪些函数 如果没有为类定义构造函数.析构函数.拷贝构造函数.重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inl ...

  10. MVC中不能使用ViewBag

    在工程文件中添加 <Reference Include="Microsoft.CSharp" /> <Reference Include="System ...