题意:给定一棵树和点的\(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. codeforces 24d Broken robot 期望+高斯消元

    题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望 ...

  2. line-height 行高的使用

    line-height:normal; 默认  字体 line-height:1.5; line-height:200%; line-height:50px;  ps : 固定的值 line-heig ...

  3. Windows的ODBC配置指南: MySQL, PostgreSQL, DB2, Oracle

    MySQL- 官网: https://dev.mysql.com/downloads/connector/odbc/- 安装: * msi格式, 直接安装即可 * zip格式, 解压缩, 命令行(管理 ...

  4. Tools: geos 使用指南

    1. 下载geos 2. 进入VS开发人员命令提示3.依次执行如下命令 >VCVARS32.BAT>cd D:\DevTool\geos-3.7.0>atuogen.bat>n ...

  5. python异常整理

    一.操作excel 时异常 1.PermissionError: [Errno 13] Permission denied (1)原因:权限错误:[Errno 13] 权限被拒绝 错误产生的原因是文件 ...

  6. Nginx集群配置启动报错

  7. 【JZOJ6411】上网

    description analysis 如果把所有大小关系连成边,小的往大的连,就可以直接上拓扑 暴力连边时间复杂度\(O(n^2)\),然而连边的过程,考虑用线段树优化 线段树上的所有儿子节点向父 ...

  8. Linux环境相关

    Linux环境相关 CentOS7网络配置静态ip CentOS7查看ip地址:以前是ifconfig,现在变成了 ip addr 当然这是配置好环境最后的结果,刚装好系统时时没有下面的ens33的相 ...

  9. JavaWeb学习篇之----Servlet过滤器Filter和监听器

    首先来看一下Servlet的过滤器内容: 一.Servlet过滤器的概念: ************************************************************** ...

  10. 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线

    题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...