题意:给定一棵树和点的\(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. frp 配置多个 web 项目,无需购买域名 (访问内网可视化界面,jupyter noterbook, visdom, tensorboard)

    frp 配置多个 web 项目,无需购买域名 简单配置,参考 前言: 网上也有很多教程包括官方文档,都需要购买域名,并且把 frpc.ini 中 [web]节配置的  custom_domains 的 ...

  2. Pregel Aggregator

  3. 深度学习攻防对抗(JCAI-19 阿里巴巴人工智能对抗算法竞赛)

    最近在参加IJCAI-19阿里巴巴人工智能对抗算法竞赛(点击了解),初赛刚刚结束,防御第23名,目标攻击和无目标攻击出了点小问题,成绩不太好都是50多名,由于找不到队友,只好一个人跟一群大佬PK,双拳 ...

  4. IOS 表单含有input框和有position: fixed导致错位的问题

    在input框聚焦失焦的时候,都调用以下js即可 setScrollTop() { let scrollTop = document.body.scrollTop + document.documen ...

  5. 用python 编写redis 暴力破解密码的程序

    本文摘自http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/ import redisimport l ...

  6. flink idea 打包jar 并放到集群上运行

    flink idea 打包jar 并放到集群上运行 在开始之前注意前提,当前项目的scala的版本要和集群上的scala一致   我已经创建好一个wordCount的flink项目   注意项目的po ...

  7. HttpUrlConnection类基本使用

    这个类用来模拟浏览器向服务器发送请求和接收响应 注意: HttpUrlConnection对象简称huc对象 1)获取huc对象向url构造中传递url字符串,并调用openconnection方法即 ...

  8. Java——面向对象的特征三:多态性

    2.5面向对象的特征三:多态性 2.5.1 关于java语言中的向上转型和向下转型 ①向上转型(upcasting) :  子--->父(自动类型转换) ②向下转型(downcasting) : ...

  9. thinkphp 域名部署

    ThinkPHP支持模块(甚至可以包含控制器)的完整域名.子域名和IP部署功能,让你的模块变得更加灵活,模块绑定到域名或者IP后,URL地址中的模块名称就可以省略了,所以还可以起到简化URL的作用. ...

  10. 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包

    使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...