首先相当于最大化access的轻重边交换次数。

  考虑每个点作为战场(而不是每个点所代表的国家与其他国家交战)对答案的贡献,显然每次产生贡献都是该点的子树内(包括自身)此次access的点与上次access的点在该点不同儿子的子树内。假设得到了最后的崛起序列,可以发现相互不包含的子树的贡献是相互独立的,只是内部交换而不交换他们的相对顺序,对答案没有任何影响。

  那么现在只需要考虑最大化某点的贡献,显然应该让不同儿子的子树内的点尽量交替access。设各点子树的Σai为si,那么当不存在2sson>si时,该点贡献为si-1,否则为2(si-max{sson})。于是如果没有修改,对每个子树求出s就能计算答案了。

  接下来考虑怎么修改。显然修改某点会影响该点到根的路径上的所有点的贡献。因为贡献与2sson>si的儿子有特殊的关系,考虑将其视为preferred child,把子树根与该儿子的边设为重边,如果不存在或根自身就是最大的就与儿子全部连轻边。同时注意到修改只会使某点的ai增加,如果其本来就是preferred child,修改后仍然是,并且可以发现这不会对答案造成影响;如果不是的话可能会存在轻重边切换的情况,其自身变为preferred child,但无论如何这说明这棵子树原来的sson不足其父亲si的一半,而这显然只能存在log次。所以用一棵不会动的LCT做一个真正的access就能修改了,可以打个lazy避免维护子树。感觉有一堆情况事实上最后也没啥要讨论的。

  虽然写了一年但是1A感觉爽爆啊?

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
#define ll long long
#define N 400010
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
#define lself tree[tree[k].fa].ch[0]
#define rself tree[tree[k].fa].ch[1]
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,p[N],t;
ll ans;
struct data{int to,nxt;
}edge[N<<];
struct data2{int ch[],fa;ll x,s,lazy,ans;
}tree[N];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k,int from)
{
tree[k].s=tree[k].x;ll mx=tree[k].x;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from)
{
tree[edge[i].to].fa=k;
dfs(edge[i].to,k);
tree[k].s+=tree[edge[i].to].s;
mx=max(mx,tree[edge[i].to].s);
}
if (*mx<=tree[k].s) tree[k].ans=tree[k].s-;
else
{
tree[k].ans+=tree[k].s-mx<<;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from&&tree[edge[i].to].s==mx) {tree[k].ch[]=edge[i].to;break;}
}
ans+=tree[k].ans;
}
void add(int k,ll x){if (k) tree[k].s+=x,tree[k].lazy+=x;}
void down(int k){if (tree[k].lazy) add(lson,tree[k].lazy),add(rson,tree[k].lazy),tree[k].lazy=;}
int whichson(int k){return rself==k;}
bool isroot(int k){return lself!=k&&rself!=k;}
void push(int k){if (!isroot(k)) push(tree[k].fa);down(k);}
void move(int k)
{
int fa=tree[k].fa,gf=tree[fa].fa,p=whichson(k);
if (!isroot(fa)) tree[gf].ch[whichson(fa)]=k;tree[k].fa=gf;
tree[fa].ch[p]=tree[k].ch[!p],tree[tree[k].ch[!p]].fa=fa;
tree[k].ch[!p]=fa,tree[fa].fa=k;
}
void splay(int k)
{
push(k);
while (!isroot(k))
{
int fa=tree[k].fa;
if (!isroot(fa))
if (whichson(fa)^whichson(k)) move(k);
else move(fa);
move(k);
}
}
void access(int k,int x)
{
tree[k].x+=x;
for (int t=;k;)
{
splay(k);
if (rson)
{
int p=rson;for (;tree[p].ch[];p=tree[p].ch[]) down(p);
splay(p);
while (!isroot(k)) move(k);
}
tree[k].s+=x;
ans-=tree[k].ans;
if ((tree[rson].s<<)<=tree[k].s) rson=;
if ((tree[t].s<<)>tree[k].s) rson=t,tree[k].ans=tree[k].s-tree[t].s<<;
else if ((tree[k].x<<)>tree[k].s) tree[k].ans=tree[k].s-tree[k].x<<;
else if ((tree[rson].s<<)>tree[k].s) tree[k].ans=tree[k].s-tree[rson].s<<;
else tree[k].ans=tree[k].s-;
ans+=tree[k].ans;
add(lson,x);
for (;lson;k=lson) down(k);
splay(k);
t=k;k=tree[k].fa;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5212.in","r",stdin);
freopen("bzoj5212.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++) tree[i].x=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
dfs(,);cout<<ans<<endl;
for (int i=;i<=m;i++)
{
int x=read(),y=read();
access(x,y);
printf(LL,ans);
}
return ;
}

BZOJ5212 ZJOI2018历史(LCT)的更多相关文章

  1. Luogu4338 ZJOI2018 历史 LCT、贪心

    传送门 题意:在$N$个点的$LCT$中,最开始每条边的虚实不定,给出每一个点的$access$次数,求一种$access$方案使得每条边的虚实变换次数之和最大,需要支持动态增加某个点的$access ...

  2. P4338 [ZJOI2018]历史 LCT+树形DP

    \(\color{#0066ff}{ 题目描述 }\) 这个世界有 n 个城市,这 n 个城市被恰好 \(n-1\) 条双向道路联通,即任意两个城市都可以 互相到达.同时城市 1 坐落在世界的中心,占 ...

  3. [BZOJ5212][ZJOI2018]历史

    传送门(洛谷) 人生第一道九条可怜……神仙操作…… 看着题解理解了一个早上才勉强看懂怎么回事…… 简化一下题目就是:已知每一个点access的总次数,求一个顺序使虚实边转化的次数最多 考虑一下,对于x ...

  4. 【BZOJ5212】[ZJOI2018]历史(Link-Cut Tree)

    [BZOJ5212][ZJOI2018]历史(Link-Cut Tree) 题面 洛谷 BZOJ 题解 显然实际上就是给定了一棵树和每个点被\(access\)的次数,求解轻重链切换的最大次数. 先考 ...

  5. [ZJOI2018]历史

    [ZJOI2018]历史 最大化access轻重链的切换次数 考虑一个点的贡献,即它交换重儿子的次数 发现这个次数只和它自己ai以及每个儿子的子树次数和有关. 一个关键的事实是: 我们可以自上而下进行 ...

  6. 【BZOJ5212】[ZJOI2018] 历史(LCT大黑题)

    点此看题面 大致题意: 给定一棵树每个节点\(Access\)的次数,求最大虚实链切换次数,带修改. 什么是\(Access\)? 推荐你先去学一学\(LCT\)吧. 初始化(不带修改的做法) 首先考 ...

  7. [ZJOI2018]历史(LCT)

    这篇还发了洛谷题解 [Luogu4338] [BZOJ5212] 题解 题意 给出一棵树,给定每一个点的 \(access\) 次数,计算轻重链切换次数的最大值,带修改. 先考虑不带修改怎么做 假设 ...

  8. 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)

    洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...

  9. LOJ2434. 「ZJOI2018」历史 [LCT]

    LOJ 思路 第一眼看似乎没有什么思路,试着套个DP上去:设\(dp_x\)表示只考虑\(x\)子树,能得到的最大答案. 合并的时候发现只有\(x\)这个点有可能做出新的贡献,而做出新贡献的时候必然是 ...

随机推荐

  1. AJAX 过程总结

    AJAX 工作过程:(1) 创建对象(需要处理兼容性问题) 创建XMLHttpRequest对象(创建一个异步调用对象) <!-- ie6以上 --> var xhr = new XMLH ...

  2. 利用Smith圆图设计匹配网络

    要实现射频最大的功率传输,必须使负载阻抗与源阻抗相匹配(即信号源阻抗与负载阻抗共轭相等),实现匹配的通常做法是在源和负载之间插入一个匹配网络,该网络不仅仅为减少功率损耗而设计,还可减少噪声干扰.提高功 ...

  3. mac指令备忘

    在这里简单记录下最近使用的快捷键,备忘,随时更新. 简单指令记录 mkdir 创建路径 pwd 输出当前路径 ls 查看目录 cd touch 创建文件 tree 输出目录树 mv 源文件 目标文件或 ...

  4. linux上网络问题

    一.网络连接失败,不能访问 1.现象描述 network 服务不能启动, ping不通, Device not managed by NetworkManager or unavailable 2.n ...

  5. java多线程相关代码

    1.创建线程的三种方式 使用Thread package com.wpbxx.test; //1.自定义一个类,继承java.lang包下的Thread类 class MyThread extends ...

  6. Dingo Api 1.0在laravel5.2中的简单应用

    Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...

  7. python之爬虫_并发(串行、多线程、多进程、异步IO)

    并发 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢 import requests def fetch_async(url): res ...

  8. 奔跑吧DKY——团队Scrum冲刺阶段-Day 4

    今日完成任务 谭鑫:主要解决之前存在的控件不灵敏问题,导致界面跳转不顺利. 黄宇塘:制作新的游戏背景图,对主界面图进行调整. 赵晓海:主要解决之前存在的控件不灵敏问题,导致界面跳转不顺利. 方艺雯:制 ...

  9. 20162327WJH第二次实验——树

    20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验 ...

  10. fullPage全屏高度自适应

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...