【LCT】历史(P4338)

正题

P4338


题目大意

有一棵树,告诉你每个点access的次数(带修改),问实链切换的最多次数


解题思路

先考虑离线的做法:

对于点 x,其不同儿子的子树access会使实链切换(对于点 x access 同理),每次都让不同儿子的子树 access,显然可以让答案最大化

但答案不一定是 szx−1sz_x-1szx1(最后无法切换),因为如果存在一个儿子 y 满足 szy>szx−szysz_y > sz_x-sz_yszy>szxszy,即该子树大小大于其他子树大小之和,那么不存在操作使得 y 中的每次access都被切换掉

所以当 szy×2≥szx+1sz_y\times 2\geq sz_x+1szy×2szx+1 时答案为 (szx−szy)×2(sz_x-sz_y)\times 2(szxszy)×2(最多切换这么多次不同的), 否则为 szx−1sz_x-1szx1


然后再考虑在线的做法:

考虑用LCT维护,实边连接满足 szy×2≥szx+1sz_y\times 2\geq sz_x+1szy×2szx+1 的儿子(不存在则不连)

每次修改可能会修改当前点到根节点的实链,那么只需考虑对该段的影响

对于原来是实边的,显然加了之后仍然满足,不影响,对于原来是虚边的,先减去原来的贡献,然后再考虑连边计算贡献

每经过一次虚边,那么其他儿子的 sz 就必定大于 当前点的 sz,那么sz至少会变大一倍,所以最多经过 log 条虚边

时间复杂度 O(nlogn)O(n\ log\ n)O(n log n)


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
#define N 400400
ll n,m,x,y,tot,ans,top,a[N],h[N],d[N];
struct rec
{ll to,nx;
}e[N<<1];
void add(ll x,ll y)
{e[++tot].to=y;e[tot].nx=h[x];h[x]=tot;return;
}
struct LCT
{#define ls son[x][0]#define rs son[x][1]ll v[N],ss[N],s[N],fa[N],son[N][2];bool NR(ll x){return fa[x]&&(son[fa[x]][0]==x||son[fa[x]][1]==x);}bool IRS(ll x){return son[fa[x]][1]==x;}void push_up(ll x){s[x]=s[ls]+s[rs]+ss[x]+v[x];return;}void rotate(ll x){ll y=fa[x],z=fa[y],k=IRS(x),g=son[x][!k];if(NR(y))son[z][IRS(y)]=x;if(g)fa[g]=y;fa[x]=z;fa[y]=x;son[x][!k]=y;son[y][k]=g;push_up(y);return;}void Splay(ll x){while(NR(x)){if(NR(fa[x])){if(IRS(x)==IRS(fa[x]))rotate(fa[x]);else rotate(x);}rotate(x);}push_up(x);return;}ll get(ll x){if(rs)return (v[x]+ss[x])*2;else if(v[x]*2>=(s[x]-s[ls])+1)return ss[x]*2;else return (s[x]-s[ls])-1;}void access(ll x,ll z){Splay(x);ans-=get(x);//减去原有贡献v[x]+=z;s[x]+=z;if(rs&&s[rs]*2<s[x]-s[ls]+1){//断去原来的边ss[x]+=s[rs];rs=0;}ans+=get(x);ll y=x;x=fa[x];for(;x;x=fa[y=x]){Splay(x);ans-=get(x);ss[x]+=z;s[x]+=z;if(rs&&s[rs]*2<s[x]-s[ls]+1){ss[x]+=s[rs];rs=0;}if(s[y]*2>=s[x]-s[ls]+1){//连接新的实边rs=y;ss[x]-=s[rs];}ans+=get(x);}return;}
}T;
void dfs(ll x)//初始连边
{ll hs=0;T.v[x]=a[x];for(ll i=h[x];i;i=e[i].nx){ll y=e[i].to;if(y==T.fa[x])continue;T.fa[y]=x;dfs(y);T.ss[x]+=T.s[y];if(T.s[y]>T.s[hs])hs=y;}T.s[x]=T.v[x]+T.ss[x];if(T.s[hs]*2>=T.s[x]+1){T.son[x][1]=hs;T.ss[x]-=T.s[hs];ans+=(T.v[x]+T.ss[x])*2;}else if(T.v[x]*2>=T.s[x]+1){ans+=T.ss[x]*2;}else ans+=T.s[x]-1;return;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;++i)scanf("%lld",&a[i]);for(ll i=1;i<n;++i){scanf("%lld%lld",&x,&y);add(x,y);add(y,x);}dfs(1);printf("%lld\n",ans);while(m--){scanf("%lld%lld",&x,&y);T.access(x,y);printf("%lld\n",ans);}return 0;
}

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

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

相关文章

微软官宣:史上最贵开发工具 75亿美金收购GitHub

微软副总裁红衣主教Scott Gu今天的一封邮件结束了这笔软件历史上最大收购案&#xff0c;微软给全球开发人员的开源代码仓库GitHub投入了75亿美金&#xff0c;确保这一平台的持续健康发展。GitHub为啥愿意被收购&#xff1f;“软件工程这个事情&#xff0c;从来就不是一笔好生意…

codeforces1438 E.Yurii Can Do Everything

E.Yurii Can Do Everything 官方题解 按照题解的意思&#xff0c;由于满足此条件的数量不多&#xff0c;因此可以挖掘某些信息进行暴力。 考虑一个good subarray&#xff1a;[al,al1,…,ar−1,ar][a_l,a_{l1},\dots,a_{r-1},a_r][al​,al1​,…,ar−1​,ar​] 按照题目意思满…

YbtOJ#791-子集最值【三维偏序】

正题 题目链接:http://www.ybtoj.com.cn/contest/123/problem/1 题目大意 给出333个长度为nnn的排列A,B,CA,B,CA,B,C。然后一个下标集合SSS的三元组是 (max{Ai},max{Bi},max{Ci})(i∈S)(max\{A_i\},max\{B_i\},max\{C_i\})(i\in S)(max{Ai​},max{Bi​},max{Ci​})(i∈S) 求…

【主席树】更为厉害(P3899)

正题 P3899 题目大意 给你一棵树&#xff0c;对于每次询问&#xff0c;给出x,k&#xff0c;问你有多少个三元组(y,z)满足x,y,z不同&#xff0c;x,y之间的距离小于k&#xff0c;且x,y都是z的祖先 解题思路 若y的深度小于x&#xff0c;那么一定在x到根节点的路径上&#xff0c…

人工智能——图像分析第二期练习

又和同学肝了半个上午&#xff08;主要是一二节有课&#xff09;&#xff0c;完成了天气图像识别的第二期练习 一开始几个题不难&#xff0c;挺简单的&#xff0c;到后面出现HOG特征拟合svm模型&#xff0c;HOG提取特征&#xff0c;又是现学内容 HOG特征的维数用cv2.HOGDescrip…

C# 中使用面向切面编程(AOP)中实践代码整洁

1. 前言最近在看《架构整洁之道》一书&#xff0c;书中反复提到了面向对象编程的 SOLID 原则&#xff08;在作者的前一本书《代码整洁之道》也是被大力阐释&#xff09;&#xff0c;而面向切面编程&#xff08;Aop&#xff09;作为面向对象编程的有力补充&#xff0c;对实践整洁…

AtCoder Beginner Contest 183 总结

本来懒得写了&#xff0c;不过第一次AK还是记录一下吧 A - ReLU ABC的签到题就是友好 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #inc…

【数论】ZAP-Queries(P3455)

正题 P3455 题目大意 有T组询问&#xff0c;每组询问给出n,m,c&#xff0c;求∑i1n∑j1m[(i,j)c]\sum_{i1}^{n}\sum_{j1}^{m}[(i,j)c]i1∑n​j1∑m​[(i,j)c] 解题思路 可以先对n,m除c这样就使得求出的数都有c的因子&#xff0c;得到式子如下 ∑i1n∑j1m[(i,j)1]∑i1n∑j1m∑…

AT4518-[AGC032C]Three Circuits【欧拉回路】

正题 题目链接:https://www.luogu.com.cn/problem/AT4518 题目大意 给出nnn个点mmm条边的一张简单无向联通图&#xff0c;求能否把它分成三个可重复点的环。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 相当于你要去掉图上的两个环后依旧有欧拉回路 首先原本肯定得…

ABB (2020牛客国庆集训派对day1)

ABB 题意&#xff1a; 长度为n的字符串&#xff0c;问最少添加多少字符可以使其构成回文字符串 题解&#xff1a; 最长回文字符串我的第一反应是manacher马拉车算法&#xff0c;那我们直接马拉车找到已有最长回文串&#xff0c;然后总长度减去不就是答案吗&#xff1f;非也…

微软对开发者献真爱,全面支持开源,加速研发云升级

全球首秀&#xff1a;支持 Java 和 Python 的 Visual Studio Live Share 协作服务与 IntelliCode 人工智能辅助编程&#xff0c;适用于物联网和智能边缘的自动机器学习能力&#xff08;Auto ML&#xff09;&#xff1b;Visual Studio App Center 提供一站式跨平台移动应用开发体…

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

今天看不下去数电vp一场div2&#xff0c;搞A搞了很长时间&#xff0c;导致后面没有时间写&#xff0c;不过今天补题的时候全是独立补出来的没有看题解 vp3题&#xff0c;补3题 A - Kids Seating 最开始想的是与质数有关&#xff0c;乱七八糟搞了半天&#xff0c;结果最后回头…

【数论】GCD(P2568)

正题 P2568 题目大意 求满足1≤x,y≤n1\leq x,y\leq n1≤x,y≤n且gcd(x,y)primegcd(x,y)primegcd(x,y)prime的数对(x,y)(x,y)(x,y)的个数 解题思路 题目即求 ∑i1n∑j1n[gcd(i,j)prime]\sum_{i1}^n\sum_{j1}^n[gcd(i,j)prime]i1∑n​j1∑n​[gcd(i,j)prime] 可以考虑先枚举…

AT4502-[AGC029C]Lexicographic constraints【二分,栈】

正题 题目链接:https://www.luogu.com.cn/problem/AT4502 题目大意 给出nnn个长度SSS&#xff0c;求一个最小mmm表示用大小为mmm的字符集构造出nnn个符合对应长度的字符串使得字符串按照给出顺序从小到大。 1≤n≤2105,1≤Si≤1091\leq n\leq 2\times 10^5,1\leq S_i\leq 10^…

2020牛客国庆集训派对day1 C. Bob in Wonderland

Bob in Wonderland 题意&#xff1a; 一棵树&#xff0c;问最少移动多少次边可以使其变成一个链&#xff1f; 移动是指&#xff1a;从原位置拆下并连到新位置&#xff0c;这样算一次 题解&#xff1a; 错误思路 我一开始在想既然求最少移动次数&#xff0c;那我们就尽可能…

Ocelot简易教程(七)之配置文件数据库存储插件源码解析

上篇文章Ocelot简易教程&#xff08;六&#xff09;之重写配置文件存储方式并优化响应数据 给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储到数据库中。并没有对实现原理进行相应的阐述。今天抽空把实现的原理给大家说道说道。明白原理后&#xff0c;大家就可…

【数论】YY的GCD(P2257)

正题 P2257 题目大意 给你T组询问&#xff0c;每组询问给出n,m&#xff0c;让你求 1≤x≤n,1≤y≤m1\leq x\leq n,1\leq y\leq m1≤x≤n,1≤y≤m 且 gcd(x,y)primegcd(x,y)primegcd(x,y)prime 的方案数 解题思路 根据题意&#xff0c;有 ∑i1n∑j1m[gcd(i,j)prime]\sum_{i1}…

ASP.NET Core 2调用Azure云上的PowerBI报表展示

在开发企业应用中&#xff0c;报表功能是当之无愧的重头戏&#xff0c;如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题。而找到一款合适的报表往往都需要考率价格、开发、风格、支撑等因素。那么&#xff0c;我在这里给大家介绍一款由微软提供的可视化报表工…

2020牛客国庆集训派对day1 Zeldain Garden

Zeldain Garden 题意&#xff1a; 问[L,R]内所有数的因子的数量和 题解&#xff1a; 如果传统暴力做肯定不行 我们来找找规律&#xff1a; 数字&#xff1a; 因子数目 1~n的因子数和 1 1 1 2 2 321/ 3 2 5311 4 3 84211 5 2 1052111 6 4 14 7 2 16 8…

CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】

正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为nnn的可重集TTT&#xff0c;求有多少个它的非空子集SSS和元素xxx满足 x∉S,gcd{S}>1,gcd(S,x)1x\notin S,gcd\{S\}>1,gcd(S,x)1x∈/​S,gcd{S}>1,gcd(S,x)1 1≤n≤51051\leq n\leq 5…