题意:给定一棵树和点的\(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. mybatis自动生成代码工具(逆向工程)

    MyBatis自动生成实体类(逆向工程) MyBatis属于一种半自动的ORM框架,它需要我们自己编写sql语句和映射文件,但是编写映射文件和sql语句很容易出错,所以mybatis官方提供了Gene ...

  2. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  3. SOLID设计原则

    SOLID设计原则 Single Responsibility Principle单一职责原则 单一职责原则(SRP)表明一个类有且只有一个职责. 一个类就像容器一样,它能添加任意数量的属性.方法等. ...

  4. 8-26接口压力测试-3Jmeter-Java请求

    1.新建maven工程 2.导入依赖,并使用shade将所需的依赖打入jar包 <?xml version="1.0" encoding="UTF-8"? ...

  5. [原创] Java 流布局管理器 FlowLayout

    参数原型: public FlowLayout(int align, int hgap, int vgap) { this.hgap = hgap; this.vgap = vgap; setAlig ...

  6. kafka保证数据不丢失机制

    kafka如何保证数据的不丢失 1.生产者如何保证数据的不丢失:消息的确认机制,使用ack机制我们可以配置我们的消息不丢失机制为-1,保证我们的partition的leader与follower都保存 ...

  7. NX二次开发-常用lib库文件

    在项目属性->配置属性->链接器->输入->附加依赖项: libufun.lib UFUNC API 函数库 libugopenint.lib UFUNC 对话框 API 函数 ...

  8. 2019/11/8 CSP模拟

    T1 药品实验 内网#4803 由概率定义,有\[a + b + c = 0\] 变形得到\[1 - b = a + c\] 根据题意有\[p_i = a p _{i - 1} + b p_i + c ...

  9. JS中 reduce() 的用法

    过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它.事实上,如果你能真正了解它的话,其实在很多地方我们都可以用得上,那么今天我们就来简单聊聊JS中 reduce ...

  10. Centos6.5安装ruby2.2.3

    一.安装库 Yum install –y gcc* openssl* wget 二.安装ruby wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby- ...