P4338-[ZJOI2018]历史【LCT】

正题

题目链接:https://www.luogu.com.cn/problem/P4338


题目大意

给出nnn个点的一棵树,和每个点进行accessaccessaccess的次数aia_iai,要求安排一个顺序使得虚实边转换最多。

mmm次修改一个点让aia_iai加上www后求答案

n,m∈[1,4∗105],ai,w∈[1,107]n,m\in [1,4*10^5],a_i,w\in[1,10^7]n,m[1,4105],ai,w[1,107]


解题思路

好像本来就很麻烦还带修改,那先不考虑修改

考虑统计每个节点下的边的虚实切换最大化,可以发现一个节点的子树中无论怎样安排accessaccessaccess顺序也不会影响外面的答案,因为对于外面的来说都相当于accessaccessaccess了这个节点。

所以这个满足子最优?(好像是这么叫的),那每一个节点的分块考虑就好了。现在对于这个节点下的边,如果两次accessaccessaccess的是在不同的儿子的子树中就会产生一点贡献。

转换一下现在的问题就是有若干种个数不同的颜色排成一排,要求相邻的异色最多。这个可以贪心解决,正常来说只要每次拿与上个不同的最多的来排就能到达sum−1sum-1sum1的答案上线,但是需要特判一下如果最多的颜色个数mxmxmx2×mx>sum2\times mx>sum2×mx>sum那么此时这样排到最后还有一种颜色剩下,答案就是2×(sum−mx)2\times (sum-mx)2×(summx)

所以一个节点的答案就是min{sum−1,2×(sum−mx)}min\{sum-1,2\times (sum-mx)\}min{sum1,2×(summx)}

但是带修改怎么搞,考虑到每次修改一定是加一个正权。

我们显然有一个式子
2×mx>sum⇒2×(mx+c)>sum+c2\times mx> sum\Rightarrow 2\times (mx+c)> sum+c2×mx>sum2×(mx+c)>sum+c
这个式子表明如果一个节点选择了2×(sum−mx)2\times (sum-mx)2×(summx)作为权值,那么它以后也都是这个权值。

sxs_xsx表示xxx子树中的权值和,对一个节点xxx定义r=max{sy(fay=x)}r=max\{s_y(fa_y=x)\}r=max{sy(fay=x)}sum=∑fay=xsysum=\sum_{fa_y=x}s_ysum=fay=xsy

如果2×mx>sum2\times mx>sum2×mx>sum那么向(x,y)(x,y)(x,y)连一条实边,其他儿子连虚边。否则全连虚边。

那么每次修改的过程中我们只需要遍历到根节点的虚边看是否需要切换即可,这个可以用LCTLCTLCT来维护。

而且因为每条虚边代表着2×sy≤sx2\times s_y\leq s_x2×sysx,所以路径上虚边的个数不会超过log⁡∑ai\log \sum a_ilogai级别。

时间复杂度O(nlog⁡∑ai)O(n\log \sum a_i)O(nlogai)SplaySplaySplay那个log⁡n\log nlogn因为小于log⁡∑ai\log \sum a_ilogai就舍去)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e5+10;
struct node{ll to,next;
}a[N<<1];
ll n,m,s[N],ls[N],ans,tot;
struct LCT{ll fa[N],s[N],w[N],v[N],t[N][2];bool Nroot(ll x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}bool Direct(ll x){return t[fa[x]][1]==x;}void PushUp(ll x){s[x]=s[t[x][0]]+s[t[x][1]]+w[x]+v[x];return;}void Rotate(ll x){ll y=fa[x],z=fa[y];ll xs=Direct(x),ys=Direct(y);ll w=t[x][xs^1];t[x][xs^1]=y;t[y][xs]=w;if(Nroot(y))t[z][ys]=x;fa[x]=z;fa[y]=x;if(w)fa[w]=y;PushUp(y);PushUp(x);return;}void Splay(ll x){while(Nroot(x)){ll y=fa[x];if(!Nroot(y))Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}ll ct(ll x,ll r,ll h){if(t[x][1])return (r-h)*2;return min(r-1,(r-v[x])*2);}void Access(ll x,ll c){Splay(x);ll r=s[x]-s[t[x][0]],h=s[t[x][1]];ans-=ct(x,r,h);v[x]+=c;r+=c;PushUp(x);if(h*2<r+1)w[x]+=h,t[x][1]=0;ans+=ct(x,r,h);PushUp(x);ll y;for(y=x,x=fa[x];x;y=x,x=fa[x]){Splay(x);ll r=s[x]-s[t[x][0]],h=s[t[x][1]];ans-=ct(x,r,h);w[x]+=c;r+=c;if(h*2<r+1)w[x]+=h,t[x][1]=h=0;if(s[y]*2>r)w[x]-=s[y],t[x][1]=y,h=s[y];ans+=ct(x,r,h);PushUp(x);}return;}
}T;
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dp(ll x,ll fa){ll son=0,mx=T.v[x]=s[x];T.fa[x]=fa;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dp(y,x);s[x]+=s[y];if(s[y]>mx)son=y,mx=s[y];}ans+=min(s[x]-1,(s[x]-mx)*2);if(mx*2>s[x])T.t[x][1]=son;T.w[x]=s[x]-T.v[x]-s[T.t[x][1]];T.s[x]=s[x];return;
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&s[i]);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}dp(1,0);printf("%lld\n",ans);for(ll i=1;i<=m;i++){ll x,w;scanf("%lld%lld",&x,&w);T.Access(x,w);printf("%lld\n",ans);}return 0;
}

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

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

相关文章

小G有一个大树

来源&#xff1a;牛客网 &#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小G想要把自己家院子里的橘子树搬到家门口&#xff08;QAQ。。就当小G是大力水手吧&…

.Net Core功能开关实战

为了快速发布开发完成的功能&#xff0c;企业通常会以比较快的迭代周期持续发布。但是由于某些 原因或场景&#xff0c;需要在发布的时候将某些功能隐藏起来或者小规模的开放&#xff08;例如只有某些特定用户可以使用、或者特定日期开放&#xff09;&#xff0c;通过使用功能开…

AtCoder Beginner Contest 179 总结

A - Plural Form 模拟签到题1 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<string> #include<iostream> #include<algorithm> using namespace std; const int N100010; int main() {IO;int T1;//cin…

纪中A组模拟赛总结(2021.7.19)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3101010lyflyflyf175175175000757575100100100 前言&#xff1a;进前10啦&#xff01;&#xff01; 总结 T1看着推了一下&#xff0c;发现可以改变答案的解决顺序&#xff0c;然后在O(n)内求解&#xff0c;打完…

AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】

正题 题目链接:https://www.luogu.com.cn/problem/AT4505 题目大意 给出nnn个点和n−1n-1n−1个点集UiU_iUi​&#xff0c;每个点集中选择两个点连边使得该图是一棵树。求方案。 n∈[1,105],∑i1n−1∣Ui∣∈[1,2∗105]n\in[1,10^5],\sum_{i1}^{n-1} |U_i|\in[1,2*10^5]n∈[1…

学习究竟是为了什么?

今天无意中看到一句话&#xff0c;人如果停止了学习&#xff0c;就开始走向失败。这句话其实应该送给每一个面临30岁焦虑期的开发者&#xff0c;同时也应该成为每一个开发者内心的真实写照。 想问一下大家一个问题&#xff0c;多久没有学习新的知识呢&#xff1f;尤其…

Codeforces Round #671 (Div. 2)

当天晚上&#xff0c;本来想参加一下比赛&#xff0c;结果感觉静不下心来做题&#xff0c;而且最难受的是读个题都不明白&#xff0c;一直在理解题意。 A - Digit Game 分析不难发现&#xff1a; 如果nnn是奇数&#xff0c;那么最后留下的数字一定是奇数位上的数字&#xff0…

【网络流】人员雇佣(luogu 1791)

正题 luogu 1791 题目大意 有n个人&#xff0c;选择第i个人的代价是aia_iai​&#xff0c;如果i,j同时被选那么有贡献wi,jw_{i,j}wi,j​&#xff0c;如果i选了j没选那么有贡献−wi,j-w_{i,j}−wi,j​&#xff0c;问你最大贡献&#xff08;减去代价&#xff09; 解题思路 最大…

AT4144-[ARC098D]Donation【Kruskal重构树,dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT4144 题目大意 nnn个点mmm条边的一张无向联通图&#xff0c;每个点有两个值ai,bia_i,b_iai​,bi​。表示经过该点时需要拥有aia_iai​元&#xff0c;该点需要捐献bib_ibi​元。 任意起点&#xff0c;询问开始时至少多少钱才…

Strategic game

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 10000K&#xff0c;其他语言20000K 64bit IO Format: %lld题目描述 Bob enjoys playing computer games, especially strategic games, but sometimes he c…

ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)

上个月15日&#xff0c;上海MVP做了一次线下的技术分享活动&#xff0c;我分享的主题是《快速构建容器化的ASP.NET Core应用程序》&#xff0c;有关这次活动的简报&#xff0c;可以参考这里。另外&#xff0c;我的主题分享的PPT也可以点击这里下载。由于线下活动时间紧迫&#…

牛客练习赛 63 F-牛牛的树行棋

F-牛牛的树行棋 大佬题解 对于每一个棋子来说&#xff0c;都是独立的&#xff0c;因此当前局面的 SG 值就是每一枚棋子的 SG 值的异或和。若一枚棋子的往子树内最多可以走 kkk 步&#xff0c;它的 SG 值为 kkk。然后就可以dfs求出整个局面的SG值。 仔细再思考一步&#xff1a…

【DP】小学生语文题(jzoj 5102)

正题 jzoj 5102 题目大意 给你两个串A,B&#xff0c;字母个数相等&#xff0c;可以把B的一个字符移到前面某个位置&#xff0c;问你最少移多少次可以使A,B相等 解题思路 设fi,jf_{i,j}fi,j​为A匹配了i-n&#xff0c;B用了j-n 1.当i,j匹配时fi,jfi1,j1f_{i,j}f_{i1,j1}fi,j…

AT3949-[AGC022D]Shopping【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/AT3949 题目大意 长度为LLL的坐标轴上&#xff0c;给出nnn个点&#xff0c;每个点xix_ixi​需要购物tit_iti​的时间&#xff0c;一辆车在0∼L0\sim L0∼L折返跑&#xff0c;求从000出发购物完回到000的最短时间。 n∈[1,310…

现代软件工程的《构建之法》

要想了解世界&#xff0c;就必须亲自来打造它。—— 帕韦泽&#xff08;Cesare Pavese&#xff09;国庆假日期间&#xff0c;我重读了邹欣老师的《构建之法》一书。我从事软件行业相关工作超过15年&#xff0c;每每在被问到给在校计算机专业大学生的学习建议时&#xff0c;我都…

牛客练习赛 62

A.牛妹的游戏 Ramsey定理&#xff1a;人话解释任意六个人中要么至少三个人认识&#xff0c;要么至少三个不认识。 结论简要证明: 假设 666 个据点分别为 A,B,C,D,E,FA,B,C,D,E,FA,B,C,D,E,F那么在 A 连向其它据点的控制链中&#xff0c;必然至少有 333条链被同一方控制&#x…

【图论】【斜率优化】前往大都会(loj 2769)

正题 jzoj 7181 题目大意 给你由若干铁路组成的图&#xff08;一个铁路上有若干点&#xff09;&#xff0c;问你从1到n在最短路径的前提下&#xff0c;乘坐的每一条铁路所花费时间的平方和的最大值 解题思路 先用dij跑出最短路图&#xff08;即长度等于最短路的所有路径&…

AT4995-[AGC034E] Complete Compress【树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT4995 题目大意 nnn个点的一棵树&#xff0c;上面有一些棋子&#xff0c;每次可以选择两个棋子移动到他们之间的路径上相邻的点上&#xff0c;求最少多少步能移动到一个点上。 n∈[1,2000]n\in[1,2000]n∈[1,2000] 解题思路 …

【每日一题】8月10日题目精讲—排座椅

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 51200K&#xff0c;其他语言102400K 64bit IO Format: %lld题目描述 上课的时候总有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的…

使用Consul做服务发现的若干姿势

从2016年起就开始接触Consul&#xff0c;使用的主要目的就是做服务发现&#xff0c;后来逐步应用于生产环境&#xff0c;并总结了少许使用经验。最开始使用Consul的人不多&#xff0c;为了方便交流创建了一个QQ群&#xff0c;这两年微服务越来越火&#xff0c;使用Consul的人也…