CF1192B Dynamic Diameter(LCT)

Foreword\text{Foreword}Foreword

@zhengrunzhe 大佬的矩阵做法过于神奇,蒟蒻无法理解…
欧拉序的做法确实非常巧妙,但我也想不到这么神仙的做法…
提供一种可能简单一些的 LCT 做法。
由于本人 LCT 无法像大佬那么神,讲的会比较详细一些,也许对其他 LCT 平民玩家更加友好?

Solution\text{Solution}Solution

本题有一个很关键的性质:边权非负。(欧拉序的做法也要基于这个性质)
又发现修改无非改大/小,在/不在原直径上,利用非负的性质分别讨论一下,就会发现新直径至少有一个节点和原来相同
所以我们一开始暴力求出直径后,只需要不断把原直径的两端点提出来,用从二者出发新的最长路径来尝试作为新直径就行了。
所以现在只需要动态维护从一个点出发的最长路径

常规套路,先边化点,边权化点权。
wxw_xwx 表示 xxx 的点权,sumxsum_xsumx 表示 xxx splay子树内点权之和,disxdis_xdisx 表示从 xxx 所在 splay 子树内深度最浅的节点出发往子树延伸的最长路径。
先不考虑 xxx 实链父亲,尝试求出xxx 出发往子树延伸的最长路径 resxres_xresx

一开始有:
resx=wxres_x=w_xresx=wx
对于 xxx 的虚儿子,对每个节点开一个 std::set 维护虚子树,进行转移:
resx←max⁡sondisson+wxres_x\gets \max_{son}dis_{son}+w_xresxsonmaxdisson+wx
还有从 xxx 的实儿子转移,不难发现其对应的就是 disrsxdis_{rs_x}disrsx
resx←disrsx+wxres_x\gets dis_{rs_x}+w_xresxdisrsx+wx
求完 resxres_xresx 后,如果 xxx 没有左儿子,说明他就是链头,直接让 disx=resxdis_x=res_xdisx=resx 即可;否则,链头可以不使用 resxres_xresx 的转移,或者使用 resxres_xresx 的转移,那么还要加上 xxx 到链头一段的权值和,分别对应 max 的前后两项:
disx=max⁡(dislsx,resx+sumlsx)dis_x=\max(dis_{ls_x},res_x+sum_{ls_x})disx=max(dislsx,resx+sumlsx)

这样就做完了。由于转移不对称,所以我们还要镜像的处理一个 dis′xdis'xdisx,在翻转时直接交换两项即可。

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=2e5+100;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;#define pr pair<ll,int>
#define mkp make_pair
pr operator + (const pr &o,const ll &w){return mkp(o.first+w,o.second);}int tr[N][2],rev[N],f[N];
ll sum[N],w[N];
pr dis1[N],dis2[N];
multiset<pr>s[N];
#define ls(x) tr[x][0]
#define rs(x) tr[x][1]
inline bool nroot(int x){return ls(f[x])==x||rs(f[x])==x;}
inline bool which(int x){return rs(f[x])==x;}inline void pushup(int x){sum[x]=w[x]+sum[ls(x)]+sum[rs(x)];dis1[x]=s[x].empty()?mkp(w[x],x<=n?x:-1):(*s[x].rbegin())+w[x];if(rs(x)) dis1[x]=max(dis1[x],dis1[rs(x)]+w[x]);if(ls(x)) dis1[x]=max(dis1[ls(x)],dis1[x]+sum[ls(x)]);dis2[x]=s[x].empty()?mkp(w[x],x<=n?x:-1):(*s[x].rbegin())+w[x];if(ls(x)) dis2[x]=max(dis2[x],dis2[ls(x)]+w[x]);if(rs(x)) dis2[x]=max(dis2[rs(x)],dis2[x]+sum[rs(x)]);return;
}
inline void Rev(int x){if(x){rev[x]^=1;swap(ls(x),rs(x));swap(dis1[x],dis2[x]);}return;
}
inline void pushdown(int x){if(rev[x]){rev[x]=0;Rev(ls(x));Rev(rs(x));}return;
}
void dfs(int x){if(!x) return;pushdown(x);debug("x=%d f=%d ls=%d rs=%d w=%lld dis1=(%lld %d) s: ",x,f[x],ls(x),rs(x),w[x],dis1[x].first,dis1[x].second);for(pr o:s[x]) debug("(%lld %d) ",o.first,o.second);debug("\n");dfs(ls(x));dfs(rs(x));
}
void print(){for(int i=1;i<=n+n-1;i++){if(!nroot(i)) dfs(i);}
}
inline void rotate(int x){int fa=f[x],gfa=f[fa];int d=which(x),son=tr[x][d^1];f[x]=gfa;if(nroot(fa)) tr[gfa][which(fa)]=x;f[fa]=x;tr[x][d^1]=fa;if(son) {f[son]=fa;}tr[fa][d]=son;pushup(fa);pushup(x);return;
}
int zhan[N];
inline void splay(int x){int top=0,y=x;zhan[++top]=y;while(nroot(y)) zhan[++top]=y=f[y];while(top) pushdown(zhan[top--]);for(int fa;fa=f[x],nroot(x);rotate(x)){if(nroot(fa)) which(fa)==which(x)?rotate(fa):rotate(x);}return;
}
inline void access(int x){for(int y=0;x;y=x,x=f[x]){splay(x);if(rs(x)){s[x].insert(dis1[rs(x)]);}if(y){s[x].erase(s[x].find(dis1[y]));}rs(x)=y;pushup(x);}return;
}
inline void makeroot(int x){access(x);splay(x);Rev(x);
}
inline void link(int x,int y){makeroot(x);makeroot(y);f[x]=y;s[y].insert(dis1[x]);pushup(y);return;
}ll mod;
ll D;
int a,b;
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();m=read();mod=read();for(int i=1;i<n;i++){int x=read(),y=read();w[n+i]=read();link(x,n+i);link(y,n+i);}for(int i=1;i<=n;i++){makeroot(i);if(dis1[i].first>D){D=dis1[i].first;a=i;b=dis1[i].second;}}ll lst=0;while(m--){ll x=(read()+lst)%(n-1)+1 +n,ww=(read()+lst)%mod;    makeroot(x);w[x]=ww;pushup(x);int u=a,v=b;D=a=b=0;makeroot(u);if(dis1[u].first>=D){D=dis1[u].first;a=u;b=dis1[u].second;}makeroot(v);if(dis1[v].first>=D){D=dis1[v].first;a=v;b=dis1[v].second;}printf("%lld\n",lst=D);}return 0;
}
/*
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博弈论(基础概念+例题)

博弈论(b站视频) 文章目录一些概念以Nim游戏为例Nim游戏介绍定义 必败/必胜局面必败/必胜局面的判定引理Nim游戏判定引理的等价命题有向图游戏对判定引理的数学描述-Sg函数有向图游戏的和题目&#xff1a;[有向图游戏][有向图游戏的和][构造/转化类]一些概念 以Nim游戏为例 Ni…

.NET Core 3.0 linux 部署小贴士

dotnet core 3.0 目前还是测试版&#xff0c;在linux下安装 sdk 需要有一些注意事项1.下载urlhttps://dotnet.microsoft.com/download/thank-you/dotnet-sdk-3.0.100-preview-009812-linux-x64-binaries2.安装指令mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.0.100…

莓良心(第二类斯特林数)

莓良心problemsolutioncodeproblem 莓在执行任务时&#xff0c;收集到了 nnn 份岩浆能源&#xff0c;其中第 iii 份的能量值是 wiw_iwi​ &#xff0c;她 决定将它们分成恰好 kkk 组带回基地&#xff0c;每一组都要有至少 111 份能源。 每一组能源会对运输设备产生负荷值&…

CF1654E Arithmetic Operations(根号分治)

解析 降智谔谔题。 明明都把做法大块想出来&#xff0c;最后很沙雕的一步掉牛角尖里了… 无能狂怒之下写了一发实际复杂度 n2n^2n2 的代码。 不过暴力艹题还是很爽的。 可能确实不太好卡吧&#xff0c;让我自己构造我是卡不掉。 更何况CF应该不会有人和我一样在如此沙雕的地方…

P2575 高手过招

P2575 高手过招 题意&#xff1a; AKN玩游戏玩累了&#xff0c;于是他开始和同伴下棋了&#xff0c;玩的是跳棋&#xff01;对手是wwx&#xff01;这两位上古神遇在一起下棋&#xff0c;使得棋局变得玄幻莫测&#xff0c;高手过招&#xff0c;必有一赢&#xff0c;他们都将用…

PuppeteerSharp: 更友好的 Headless Chrome C# API

前端就有了对 headless 浏览器的需求&#xff0c;最多的应用场景有两个UI 自动化测试&#xff1a;摆脱手工浏览点击页面确认功能模式爬虫&#xff1a;解决页面内容异步加载等问题也就有了很多杰出的实现&#xff0c;前端经常使用的莫过于 PhantomJS 和 selenium-webdriver&…

尽梨了(贪心+dp)

尽梨了problemsolutioncodeproblem 丰之崎学园附近共有 nnn 个商店&#xff0c;在时刻 000 时&#xff0c;英梨梨从学园出发开始购物。 从学园走到任意一个商店&#xff0c;或从一个商店走到另一个商店需要 111 单位时间。 如果英梨梨在时刻 ttt 到达了商店 iii &#xff0c…

CF1612G Max Sum Array

解析 被蓝题虐了。&#xff08;悲 确实不太难&#xff0c;就是没往那边想。 考虑如果某个值的下标分别位 i1,i2,...,ini_1,i_2,...,i_ni1​,i2​,...,in​ 那么如何计算贡献。 每一个下标和前面统计时作为被减数&#xff0c;和后面统计时作为减数&#xff0c;所以 iki_kik​ …

【Acwing 219. 剪纸游戏】

【Acwing 219. 剪纸游戏】 题意&#xff1a; 给定一张 NM 的矩形网格纸&#xff0c;两名玩家轮流行动。 在每一次行动中&#xff0c;可以任选一张矩形网格纸&#xff0c;沿着某一行或某一列的格线&#xff0c;把它剪成两部分。 首先剪出 11 的格纸的玩家获胜。 两名玩家都采取…

中国.NET:东莞+长沙.NET俱乐部现场花絮及合肥、苏州、上海等地活动预

《传承有序》与微软技术的发展历程相似&#xff0c;微软俱乐部的发展经历着沉沉浮浮&#xff0c;曾经随着微软走向封闭与固执&#xff0c;.NET社区年轻一代的声音被忽略&#xff0c;.NET社区后继无人。社区的沉默是可怕的&#xff0c;很多社区沉寂消亡。但是在2018年&#xff0…

团不过(dp)

团不过problemsolutioncodeproblem 由比滨结衣和雪之下雪乃在玩 NimNimNim 游戏。 共有 nnn 堆石子&#xff0c;双方轮流操作&#xff0c;每次可以从一堆非空石子堆中取走任意个石 子&#xff0c;取走最后一个石子的人胜利。 她们决定让由比滨结衣先手&#xff0c;但忘记了每…

【AcWing 235. 魔法珠

【AcWing 235. 魔法珠 题意&#xff1a; 有n堆魔法珠&#xff0c;第i堆有ai个&#xff0c;两个人轮流进行以下操作&#xff1a; 当轮到某人操作时&#xff0c;如果每堆中魔法珠的数量均为 1&#xff0c;那么他就输了。 问谁赢谁输 题解&#xff1a; 经典博弈论问题 注意本…

P5039 [SHOI2010]最小生成树(网络流)

解析 我大受震撼。 真的没想到是网络流。&#xff08;事后诸葛&#xff1a;看几百的数据范围应该试试枚举算法&#xff09; 一道比较开眼界的题吧。 然而用一个十分钟写完的假做法可以骗90分&#xff0c;还是挺香的 首先是一个没什么意思的转化&#xff1a;操作等价于给一条边…

Abp vNext 切换MySql数据库

Abp vNext是Abp的下一代版本&#xff0c;目前还在经一步完善&#xff0c;代码已经全部重写了&#xff0c;好的东西保留了下来&#xff0c;去除了很多笨重的东西&#xff0c;从官宣来看&#xff0c;Abp vNext主要是为了以后微服务架构而诞生的。从源码来看&#xff0c;Abp vNext…

P1199 [NOIP2010 普及组] 三国游戏

P1199 [NOIP2010 普及组] 三国游戏 题意&#xff1a; 有n个武将&#xff0c;每两个武将之间都有默契值&#xff0c;你和电脑玩游戏&#xff0c;轮流选一个。轮到计算机挑选时&#xff0c;它会尝试将对手军队中的每个武将与当前每个自由武将进行一一配对&#xff0c;找出所有配…

P1791 [国家集训队]人员雇佣(网络流)

解析 熟练和固化在有些时候是等价的。 一个看起来喜闻乐见的模型。 n2n^2n2 信息量你在逗我… 结果是&#xff1a;点数 n2n^2n2 TLE&#xff0c;边数 n2n^2n2 AC。 一种之前所没有见过的打开方式。 还是考虑最小割模型&#xff0c;点 iii 向原点连一条 AiA_iAi​ 的边&#xf…

【网络流专练一】UVA五题(UVA12125,UVA11082,UVA10983,UVA1306,UVA10735)

网络流专练March of the Penguins矩阵解压 Matrix DecompressingBuy one, get the rest freeThe K-League混合图的欧拉回路 Euler Circuit什么破网站&#xff0c;多余空格换行都不能有&#xff0c;还nm不报PE/RE只报WA。 少一行换行也不行&#xff0c;这是什么垃圾文本比较。 …

采用.NET CORE的全异步模式打造一款免费的内网穿透工具--NSmartProxy

什么是NSmartProxy&#xff1f;NSmartProxy是一款免费的内网穿透工具。特点跨平台&#xff0c;客户端和服务端均可运行在MacOS&#xff0c;Linux&#xff0c;Windows系统上&#xff1b;使用方便&#xff0c;配置简单&#xff1b;多端映射&#xff0c;一个NSmart Proxy客户端可以…

Acwing 236. 格鲁吉亚和鲍勃(博弈论妙题)

Acwing 236. 格鲁吉亚和鲍勃 题意&#xff1a; 一排网格&#xff0c;将网格从左到右依次编号 1,2,3&#xff0c;…&#xff0c;并将 N 个西洋棋棋子放在不同的网格上&#xff0c;如下图所示&#xff1a; 两个人轮流移动棋子 每次玩家选择一个棋子&#xff0c;并将其向左移动…

.NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯

1&#xff0c;前言开发环境&#xff1a;在 Visual Studio 2017&#xff0c;.NET Core 2.x串口通讯用于设备之间&#xff0c;传递数据&#xff0c;物联网设备中广泛使用串口方式连接通讯&#xff0c;物联网通讯协议 &#xff1a;Modbus 协议 ASCII、RTU、TCP模式是应用层的协议&…