2019.03.04【ZJOI2018】【BZOJ5212】【洛谷P4338】历史(假LCT)
洛谷传送门
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∑nai,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)相关推荐
- 《SRPG游戏开发》导航(2019.03.04更新)
<SRPG游戏开发>导航 第一章到第五章并没有使用Markdown,且经过CSDN几次改版和取消目录,这几章排版有些怪怪的. 2019.03.04 第十一章(十 - 十二) ,间章 第十一 ...
- 2019.03.04【ZJOI2018】【BZOJ5213】【洛谷P4339】迷宫(自动机)(数论)
BZOJ传送门 洛谷传送门 解析: 这道题本质其实是要最小化一个能够接受所有mmm进制下KKK的倍数的自动机. 显然我们有一个方案就是KKK个节点,iii的第jjj条边向(i∗m+j)%K(i*m+j ...
- 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)
洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...
- [ZJOI2018]历史,洛谷P4338,类LCT维护
正题 题目大意,大致就是给出一棵有根数,给出每个点access的次数,要你安排顺序,求轻重边切换最多多少次,动态加次数. 第一步其实还挺好想的,思考一下如何静态做,发现相当于对于每一个节点,就是让各个 ...
- 2019年东莞特长生 游戏(洛谷 P2661 信息传递)
Description 某校科技节到了,有? 个同学(编号为1到?)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为? 的同学的信息传递对象是编号为??的同学. 游戏开始 ...
- 洛谷 P2486 [SDOI2011]染色 LCT
Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #inc ...
- 2019.03.21【ZJOI2007】【BZOJ1095】【洛谷P2056】Hide 捉迷藏(DFS序)(线段树)
BZOJ传送门 洛谷传送门 解析: 其实就是QTREE4的弱化版,可以直接用QTREE4的解法来做. 但是这道题有优秀的O(nlogn)O(n\log n)O(nlogn)做法. 我们考虑利用DFS ...
- 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金
[题目链接] ybt 1179:奖学金 ybt 1938:[07NOIP普及组]奖学金 OpenJudge NOI 1.10 04:奖学金 洛谷 P1093 [NOIP2007 普及组] 奖学金 [题 ...
- 信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金
[题目链接] ybt 1839:[05NOIP提高组]谁拿了最多奖学金 OpenJudge NOI 1.9 04:谁拿了最多奖学金 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金 [ ...
- 信息学奥赛一本通 1111:不高兴的津津 | 1926:【04NOIP普及组】不高兴的津津| OpenJudge NOI 1.9 03 | 洛谷 P1085 [NOIP2004 普及组] 不高兴的津津
[题目链接] ybt 1111:不高兴的津津 ybt 1926:[04NOIP普及组]不高兴的津津 OpenJudge NOI 1.9 03:不高兴的津津 洛谷 P1085 [NOIP2004 普及组 ...
最新文章
- 万能系统卸载器免root_Linux umount命令:卸载文件系统
- [python skill]利用python计算T分布下的置信区间
- MAGIX Photostory Deluxe 2021中文版
- 文巾解题 1833. 雪糕的最大数量
- 【学术相关】读研究生,从学会「拒绝」导师开始
- windows上使用的免费连接linux终端xshell6,xftp6下载
- 安卓9 webview打开指定url报错或者空白
- JS组件系列——两种bootstrap multiselect组件大比拼
- Ubuntu 安装 Cassandra 数据库
- SAE J1939协议(二)
- Xshell6下载安装
- catia设计树_CATIA目录树节点管理 | 坐倚北风
- python进行回归方程显著性检验
- C# 如何批量删除Excel单元格中的公式只保留数据
- el-input-number中添加suffix
- 新唐(nuvoton)单片机学习资料汇总
- Spatial Join学习
- 【技术讨论】从弹弹堂说起,如何用2D物理引擎编写一个游戏lt;一gt;2011-11-05 10:36
- Kali使用beef
- A4纸张缩印怎么只打印一半A4纸的内容
热门文章
- 自动控制原理:反馈控制系统的复域分析
- 让你秒读懂阿里云数据库架构与选型
- win10控制面板快捷打开方式
- 机器学习 (六): Sigmoid 公式推导和理解
- php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)
- Android--高德地图,显示地图,并定位当前的位置
- html如何设置本地链接,本地连接受限制或无连接【方法|图文教程】-太平洋IT百科...
- 拖住对手?有赞刚收费,点点客就推同类免费产品
- 反编译工具的安装与使用(解决部分能反编译部分不能反编译)
- 【Flask】学习笔记 #12 —— JinJa2模板继承与引入