洛谷传送门

BZOJ传送门


解析:

其实就是给你一颗LCTLCTLCT,初始全部都是虚边,111恒为根。给出每个点accessaccessaccess的次数,求出所有方案中,切换实链的最大次数。

你问我为什么这个和原题意是等价的?自己对断实链,连实链的情况分类讨论啊。

于是我们现在考虑每个点的实链的变化,显然只有它和它子树内节点的accessaccessaccess能够影响到它的实链。而同一个子树内的点的accessaccessaccess对它的影响没有区别。

换句话说,每个点的实链切换次数最大化是独立的,互不影响。

显然只有来自当前虚边子树的accessaccessaccess或者自己的accessaccessaccess能够切换实链。

实际上这是一个经典问题,给出nnn种颜色的球,每种aia_iai​个,问将这些球排成一排,相邻的两个颜色不同的最大对数是多少。

令t=∑i=1nai,h=max⁡{ai}t=\sum\limits_{i=1}^na_i,h=\max\{a_i\}t=i=1∑n​ai​,h=max{ai​},则答案是这个东西:
min⁡(t−1,2∗(t−h))\min(t-1,2*(t-h))min(t−1,2∗(t−h))

现在考虑证明。

如果最大颜色没有过半的话,我们总是有一个贪心策略,选择和当前位置颜色不同的,剩余球最多的颜色放在下一个位置,可以证明,这样总是能够构造出解。

不然的话,我们将颜色最多的球排成一列,将剩下的球找空隙放进去就行了。

所以不带修改的话直接树形DP就行了。

现在考虑带修改。

首先由一个糖水不等式得到:h+wt+w>ht\frac{h+w}{t+w} > \frac{h}{t}t+wh+w​>th​

所以修改位置向上的所有决策已经为2∗(t−h)2*(t-h)2∗(t−h)的位置就不可能改变决策或决策的值了。

我们发现这是一条链的结构。

。。。好的这就是LCT。将这条链上的边全部设置成实边。

但是有可能原来决策为t−1t-1t−1的位置需要改变了啊。

暴力改啊。我们发现,越过一条轻边后的ttt会翻倍,也就是说轻边最多只有O(log⁡∑ai)O(\log \sum{a_i})O(log∑ai​)条,不特意卡的话也就30多,卡的话也就40多,而且还不可能每次访问那么多。

也就是需要在accessaccessaccess的时候判断当前边到底能不能修改为实边。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc get_char
#define cs constnamespace IO{inline char get_char(){static cs int Rlen=1<<20|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;}inline int getint(){re  char c;while(!isdigit(c=gc()));re int num=c^48;while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);return num;}
}
using namespace IO;cs int N=4e5+5;
int n,m;int last[N],nxt[N<<1],to[N<<1],ecnt;
inline void addedge(int u,int v){nxt[++ecnt]=last[u],last[u]=ecnt,to[ecnt]=v;nxt[++ecnt]=last[v],last[v]=ecnt,to[ecnt]=u;
}int fa[N],son[N][2];
ll sum[N],f[N],val[N],ans;
inline bool which(int u){return son[fa[u]][1]==u;}
inline bool isroot(int u){return son[fa[u]][0]!=u&&son[fa[u]][1]!=u;}
inline void pushup(int u){sum[u]=sum[son[u][0]]+sum[son[u][1]]+val[u]+f[u];}inline void Rotate(int u){int Fa=fa[u],FA=fa[Fa];bool pos=which(u);if(!isroot(Fa))son[FA][which(Fa)]=u;son[Fa][pos]=son[u][!pos];if(son[Fa][pos])fa[son[Fa][pos]]=Fa;son[u][!pos]=Fa;fa[Fa]=u;fa[u]=FA;pushup(Fa);pushup(u);
}inline void Splay(int u){for(int re Fa=fa[u];!isroot(u);Rotate(u),Fa=fa[u])if(!isroot(Fa))Rotate(which(Fa)==which(u)?Fa:u);
}inline ll calc(int u,ll t,ll h){if(son[u][1])return t-h<<1;if(val[u]*2>t)return t-val[u]<<1;return t-1;
}inline void modify(int u,int w){Splay(u);ll t=sum[u]-sum[son[u][0]],h=sum[son[u][1]];ans-=calc(u,t,h);sum[u]+=w,val[u]+=w;t+=w;if(h*2<t+1)f[u]+=h,son[u][1]=0;ans+=calc(u,t,h);pushup(u);int v=u;for(u=fa[u];u;u=fa[v=u]){Splay(u);t=sum[u]-sum[son[u][0]],h=sum[son[u][1]];ans-=calc(u,t,h);sum[u]+=w,t+=w,f[u]+=w;if(h*2<t+1)f[u]+=h,son[u][1]=0,h=0;if(sum[v]*2>t)f[u]-=sum[v],son[u][1]=v,h=sum[v];ans+=calc(u,t,h);pushup(u);}
}void dfs(cs int &u){sum[u]=val[u];int hson=0;ll mx=val[u];for(int &e=last[u],v=to[e];e;v=to[e=nxt[e]])if(v^fa[u]){fa[v]=u;dfs(v);sum[u]+=sum[v];if(mx<=sum[v])mx=sum[hson=v];}ans+=min(sum[u]-1,sum[u]-mx<<1);if(mx*2>=sum[u]+1)son[u][1]=hson;f[u]=sum[u]-val[u]-sum[son[u][1]];
}signed main(){n=getint(),m=getint();for(int re i=1;i<=n;++i)val[i]=getint();for(int re i=1;i<n;++i)addedge(getint(),getint());dfs(1);cout<<ans<<"\n";int u,w;while(m--){u=getint(),w=getint();modify(u,w);cout<<ans<<"\n";}return 0;
}

2019.03.04【ZJOI2018】【BZOJ5212】【洛谷P4338】历史(假LCT)相关推荐

  1. 《SRPG游戏开发》导航(2019.03.04更新)

    <SRPG游戏开发>导航 第一章到第五章并没有使用Markdown,且经过CSDN几次改版和取消目录,这几章排版有些怪怪的. 2019.03.04 第十一章(十 - 十二) ,间章 第十一 ...

  2. 2019.03.04【ZJOI2018】【BZOJ5213】【洛谷P4339】迷宫(自动机)(数论)

    BZOJ传送门 洛谷传送门 解析: 这道题本质其实是要最小化一个能够接受所有mmm进制下KKK的倍数的自动机. 显然我们有一个方案就是KKK个节点,iii的第jjj条边向(i∗m+j)%K(i*m+j ...

  3. 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)

    洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...

  4. [ZJOI2018]历史,洛谷P4338,类LCT维护

    正题 题目大意,大致就是给出一棵有根数,给出每个点access的次数,要你安排顺序,求轻重边切换最多多少次,动态加次数. 第一步其实还挺好想的,思考一下如何静态做,发现相当于对于每一个节点,就是让各个 ...

  5. 2019年东莞特长生 游戏(洛谷 P2661 信息传递)

    Description 某校科技节到了,有? 个同学(编号为1到?)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为? 的同学的信息传递对象是编号为??的同学. 游戏开始 ...

  6. 洛谷 P2486 [SDOI2011]染色 LCT

    Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #inc ...

  7. 2019.03.21【ZJOI2007】【BZOJ1095】【洛谷P2056】Hide 捉迷藏(DFS序)(线段树)

    BZOJ传送门 洛谷传送门 解析: 其实就是QTREE4的弱化版,可以直接用QTREE4的解法来做. 但是这道题有优秀的O(nlog⁡n)O(n\log n)O(nlogn)做法. 我们考虑利用DFS ...

  8. 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金

    [题目链接] ybt 1179:奖学金 ybt 1938:[07NOIP普及组]奖学金 OpenJudge NOI 1.10 04:奖学金 洛谷 P1093 [NOIP2007 普及组] 奖学金 [题 ...

  9. 信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金

    [题目链接] ybt 1839:[05NOIP提高组]谁拿了最多奖学金 OpenJudge NOI 1.9 04:谁拿了最多奖学金 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金 [ ...

  10. 信息学奥赛一本通 1111:不高兴的津津 | 1926:【04NOIP普及组】不高兴的津津| OpenJudge NOI 1.9 03 | 洛谷 P1085 [NOIP2004 普及组] 不高兴的津津

    [题目链接] ybt 1111:不高兴的津津 ybt 1926:[04NOIP普及组]不高兴的津津 OpenJudge NOI 1.9 03:不高兴的津津 洛谷 P1085 [NOIP2004 普及组 ...

最新文章

  1. 万能系统卸载器免root_Linux umount命令:卸载文件系统
  2. [python skill]利用python计算T分布下的置信区间
  3. MAGIX Photostory Deluxe 2021中文版
  4. 文巾解题 1833. 雪糕的最大数量
  5. 【学术相关】读研究生,从学会「拒绝」导师开始
  6. windows上使用的免费连接linux终端xshell6,xftp6下载
  7. 安卓9 webview打开指定url报错或者空白
  8. JS组件系列——两种bootstrap multiselect组件大比拼
  9. Ubuntu 安装 Cassandra 数据库
  10. SAE J1939协议(二)
  11. Xshell6下载安装
  12. catia设计树_CATIA目录树节点管理 | 坐倚北风
  13. python进行回归方程显著性检验
  14. C# 如何批量删除Excel单元格中的公式只保留数据
  15. el-input-number中添加suffix
  16. 新唐(nuvoton)单片机学习资料汇总
  17. Spatial Join学习
  18. 【技术讨论】从弹弹堂说起,如何用2D物理引擎编写一个游戏lt;一gt;2011-11-05 10:36
  19. Kali使用beef
  20. A4纸张缩印怎么只打印一半A4纸的内容

热门文章

  1. 自动控制原理:反馈控制系统的复域分析
  2. 让你秒读懂阿里云数据库架构与选型
  3. win10控制面板快捷打开方式
  4. 机器学习 (六): Sigmoid 公式推导和理解
  5. php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)
  6. Android--高德地图,显示地图,并定位当前的位置
  7. html如何设置本地链接,本地连接受限制或无连接【方法|图文教程】-太平洋IT百科...
  8. 拖住对手?有赞刚收费,点点客就推同类免费产品
  9. 反编译工具的安装与使用(解决部分能反编译部分不能反编译)
  10. 【Flask】学习笔记 #12 —— JinJa2模板继承与引入