题意:给定一棵树和点的\(Access\)次数,求切换链的最大值。

考虑修改时实边与虚边的贡献,用\(LCT\)维护此树。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2000010;
const int INF = 0x7fffffff;
#define int long long
inline int read()
{
int q=0,f=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-1;ch=getchar();
}
while(isdigit(ch)){
q=q*10+ch-'0';ch=getchar();
}
return q*f;
}
int head[maxn];
int cnt;
struct edge
{
int nxt;
int to;
}e[maxn<<1];
inline void add(int u,int v){
e[++cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt;
return;
} int ans; struct LCT{
int ch[maxn][2];
int fa[maxn];
int stack[maxn];
int val[maxn];
int sum[maxn];
int isum[maxn];
inline bool isroot(int x){
return ch[fa[x]][0] != x && ch[fa[x]][1] != x;
}
inline void push_up(int now){
sum[now] = val[now] + sum[ch[now][0]]+sum[ch[now][1]]+isum[now];
}
inline void rotate(int x){
int f=fa[x];
int ff = fa[f];
int y = (ch[f][0] == x);
bool flag = isroot(f);
fa[x] = ff;
fa[f] = x;
fa[ch[x][y]] = f;
if(!flag) ch[ff][ch[ff][1]==f] = x;
ch[f][!y] = ch[x][y];
ch[x][y] = f;
push_up(f);
}
inline void splay(int x){
while(!isroot(x)){
int f = fa[x];
if(!isroot(f)){
if((ch[fa[f]][0] == f)^(ch[f][0] == x)) rotate(x);
else rotate(f);
}
rotate(x);
}
push_up(x);
}
inline void access(int x,int v,int nt){
for(;x;nt = x,x = fa[x]){
splay(x);
int res = sum[ch[x][1]] + val[x] + isum[x];
if(ch[x][1]){
ans -=((res-sum[ch[x][1]]) << 1);
}
else if(res + 1 <= val[x] * 2){
ans -= 2*(res - val[x]);
}
else ans -= (res - 1);
sum[x] += v;
isum[x] += v;
res += v;
if(res+1 > sum[ch[x][1]]*2){
isum[x] += sum[ch[x][1]];
ch[x][1] = 0;
}
if(res + 1<= sum[nt]*2){
ch[x][1] = nt;
isum[x] -= sum[ch[x][1]];
}
if(ch[x][1]){
ans += 2*(res - sum[ch[x][1]]);
}
else if(res + 1 <= val[x]*2){
ans += 2*(res - val[x]);
}
else ans += (res - 1);
}
}
inline void update(int x,int f){
splay(x);
int res = sum[ch[x][1]] + val[x] + isum[x];
if(ch[x][1]) ans -= 2*(res - sum[ch[x][1]]);
else if(res + 1 <= val[x] * 2){
ans -= 2*(res - val[x]);
}
else ans -= (res - 1);
val[x] += f;
sum[x] += f;
res += f;
if(res + 1 > sum[ch[x][1]] * 2){
isum[x] += sum[ch[x][1]];
ch[x][1] = 0;
}
if(ch[x][1]){
ans += 2*(res - sum[ch[x][1]]);
}
else if(res + 1 <= val[x] * 2){
ans += (res - val[x]) * 2;
}
else ans += (res - 1);
access(fa[x],f,x);
}
inline void dfs(int x,int f){
fa[x] = f;
sum[x] = val[x];
int maxm = val[x];
int i;
int tmp = x;
for(int i = head[x];i;i=e[i].nxt){
int y = e[i].to;
if(y == f) continue;
dfs(y,x);
sum[x] += sum[y];
if(sum[y] > maxm){
tmp = y;
maxm = sum[y];
}
}
ans += min(sum[x]-1,2*(sum[x]-maxm));
if(tmp != x && sum[x] + 1 <= maxm * 2) ch[x][1] = tmp;
isum[x] = sum[x] - val[x] - sum[ch[x][1]];
}
inline void ins(){
dfs(1,0);
}
}lct; signed main()
{
int n = read(),m=read();
for(int i = 1;i <= n; ++i){
lct.val[i] = read();
}
for(int i = 1;i < n; ++i){
int u=read(),v=read();
add(u,v);
add(v,u);
}
lct.ins();
cout<<ans<<endl;
for(int i = 1;i <=m; ++i){
int x = read(),v = read();
lct.update(x,v);
cout<<ans<<endl;
}
return 0; }

[ZJOI 2018]历史的更多相关文章

  1. ZJOI 2018 一试记

    ZJOI一试几天,天微冷,雨.倒是考试当天近午时分出了太阳. 开题前的一刻,心情反而平静了,窗外泛着淡金色的日光照进来,仿佛今天的我并不是所谓来冲击省队,而只是来经历一场洗礼. 开题了,虽然有一点小插 ...

  2. 【ZJOI 2018】 历史(lct)

    历史 题目描述 九条可怜是一个热爱阅读的女孩子. 这个世界有 $n$ 个城市,这 $n$ 个城市被恰好 $n-1$ 条双向道路联通,即任意两个城市都可以互相到达.同时城市 $1$ 坐落在世界的中心,占 ...

  3. 【ZJOI 2018】线图(树的枚举,hash,dp)

    线图 题目描述 九条可怜是一个热爱出题的女孩子. 今天可怜想要出一道和图论相关的题.在一张无向图 $G$ 上,我们可以对它进行一些非常有趣的变换,比如说对偶,又或者说取补.这样的操作往往可以赋予一些传 ...

  4. [ZJOI 2018] 线图

    别想多了我怎么可能会正解呢2333,我只会30分暴力(好像现场拿30分已经不算少了2333,虽然我局的30分不是特别难想). 首先求k次转化的点数显然可以变成求k-1次转化之后的边数,所以我们可以先让 ...

  5. NOIWC前的交流题目汇总

    RT 2018.12.27 i207M:BZOJ 4695 最假女选手 以维护最大值为例,记录最大值和严格次大值和最大值的出现次数,然后取min的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ...

  6. 2018.08.14 bzoj4241: 历史研究(回滚莫队)

    传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...

  7. 【开源】C#.NET股票历史数据采集,【附18年历史数据和源代码】

    如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 重点重点:我没有买股票,没有买股票,股市是个坑,小心割韭菜哦. 本文的初衷是数据分析(分析结果就不说了,就是想看看筛选点数据),只不过搞 ...

  8. 导航狗IT周报-2018年05月18日

    原文链接:https://www.daohanggou.cn/2018/05/18/it-weekly-8/ DDoS专题 最近Web安全里的一个热点就是包括阮一峰博客在内的多个教育类IT网站被DDo ...

  9. JVM基础系列第2讲:Java 虚拟机的历史

    说起 Java 虚拟机,许多人就会将其与 HotSpot 虚拟机等同看待.但实际上 Java 虚拟机除了 HotSpot 之外,还有 Sun Classic VM.Exact VM.BEA JRock ...

随机推荐

  1. 2019-5-16-WPF-光标初始化的时候-temp-文件夹满了无法创建

    title author date CreateTime categories WPF 光标初始化的时候 temp 文件夹满了无法创建 lindexi 2019-05-16 19:16:27 +080 ...

  2. 关于h5打包后 wag包无法安装的问题

    如果不是逻辑错误,那么有可能是下列三种情况之一, 1 wgt打包时的appid与安装包不符 2 打包wgt文件和打包安装包文件 用的不是同一个HBuilder账户 3 安装包打包时权限配置,和wgt包 ...

  3. pycharm 2020 激活码 破解教程

    以下是安装完pycharm后进行破解!!   1.修改hosts,在hosts文件最后添加2行“0.0.0.0 account.jetbrains.com”和“0.0.0.0 www.jetbrain ...

  4. leetcode-12周双周赛-5090-抛掷硬币

    题目描述: 二维dp: class Solution: def probabilityOfHeads(self, prob: List[float], target: int) -> float ...

  5. nextJS使用注意事项

    项目参考 nextJs-yicha 1. 采用方案 create-next-app.antd (1)安装 npx create-next-app --example with-ant-design m ...

  6. hibernate 一对多查询 对多的一方进行分页

    //查询用户留言@Overridepublic List<LeaveWords> getLeaveWords(String userName) {Session session = nul ...

  7. Spring-Security (学习记录六)--采用ehcache缓存UserDetails

    目录 1. spring-security提供了缓存UserDetails的UserDetailsService实现类. 2. 通过配置来完成缓存 UserDetails (使用ehcache) 3. ...

  8. 一幅图解决R语言绘制图例的各种问题

    一幅图解决R语言绘制图例的各种问题 用R语言画图的小伙伴们有木有这样的感受,"命令写的很完整,运行没有报错,可图例藏哪去了?""图画的很美,怎么总是图例不协调?" ...

  9. HSE_VALUE 修改问题

    MDK的例程给的外部晶振是25Mhz,以24Mhz为例,介绍修改方法. ·1. 修改HSE_VALUE 在 “stm32f4xx.h" 搜索 ”HSE_VALUE" 会看到下面这句 ...

  10. C#标准的事件模型

    事件模型的几个规范: 委托类型的名称以EventHandler结束: 委托原型返回值为void; 委托原型具有两个参数:sender表示事件触发者,e表示事件参数: 事件参数的名称以EventArgs ...