「ZJOI2018」历史(LCT)

\(ZJOI\) 也就数据结构可做了……

题意:给定每个点 \(access\) 次数,使轻重链切换次数最大,带修改。

\(30pts:\)

挺好想的。发现切换次数只跟子树中所有结点的 \(access\) 次数,可以树形 \(dp\)。假设 \(x\) 有 \(m\) 个儿子,每个儿子的 \(access\) 次数为 \(A_i\),自己为 \(A_0\),问题转换成有 \(m+1\) 种颜色,问怎么使颜色不同的间隔最多。使 \(sum=\sum_{i=0}^{m}A_i,val=\max_{i=0}^{m}A_i\),那么答案为 \(\min(sum-1,2\times (sum-val))\)

那么我们把 \(\min\) 拆开,当 \(2\times val>sum\) 时,\(2\times (sum-val)\) 更小,否则 \(sum-1\) 更小。

然后就可以 \(O(n)\) 预处理了。

\(100pts:\)

考虑怎么带修改。

我们暴力跳肯定不行,那可以用 \(LCT\) 模拟这个暴力跳的过程。时间复杂度 \(O(n\log n)\)

\(Code\ below:\)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=400000+10;
int n,m,son[maxn],op[maxn];
int ch[maxn][2],fa[maxn];ll w[maxn],sum[maxn],siz[maxn],ans;
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot; inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
void print(ll x){
if(x<0){putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
} inline void pushup(int x){
sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+siz[x]+w[x];
}
inline bool nrt(int x){
return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
}
inline void rotate(int x){
int y=fa[x],z=fa[y],k=(ch[y][1]==x),u=ch[x][k^1];
if(nrt(y)) ch[z][ch[z][1]==y]=x;
ch[y][k]=u;ch[x][k^1]=y;
if(u) fa[u]=y;fa[y]=x;fa[x]=z;
pushup(y);pushup(x);
}
inline void splay(int x){
int y,z;
while(nrt(x)){
y=fa[x],z=fa[y];
if(nrt(y)) rotate((ch[y][1]==x)^(ch[z][1]==y)?x:y);
rotate(x);
}
} inline void addedge(int x,int y){
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
} void dfs(int x,int f){
fa[x]=f;
ll maxson=-1;
for(int i=head[x],y;i;i=nxt[i]){
y=to[i];
if(y==f) continue;
dfs(y,x);siz[x]+=sum[y];
if(sum[y]>maxson) maxson=sum[y],son[x]=y;
}
sum[x]=siz[x]+w[x];
if((maxson<<1)>sum[x]){
op[x]=0;ans+=(sum[x]-maxson)<<1;
ch[x][1]=son[x];siz[x]-=maxson;
}
else if((w[x]<<1)>sum[x]) op[x]=1,ans+=(sum[x]-w[x])<<1;
else op[x]=2,ans+=sum[x]-1;
} inline void modify(int x,int z){
ll S;
for(int y=0;x;y=x,x=fa[x]){
splay(x);S=sum[x]-sum[ch[x][0]];
ans-=(op[x]<2)?(S-(op[x]?w[x]:sum[ch[x][1]]))<<1:S-1;
S+=z;sum[x]+=z;y?siz[x]+=z:w[x]+=z;
if((sum[y]<<1)>S) siz[x]+=sum[ch[x][1]]-sum[y],ch[x][1]=y;
if((sum[ch[x][1]]<<1)>S) op[x]=0,ans+=(S-sum[ch[x][1]])<<1;
else {
if(ch[x][1]) siz[x]+=sum[ch[x][1]],ch[x][1]=0;
if((w[x]<<1)>S) op[x]=1,ans+=(S-w[x])<<1;
else op[x]=2,ans+=S-1;
}
}
} int main()
{
n=read(),m=read();
int x,y;
for(int i=1;i<=n;i++) w[i]=read();
for(int i=1;i<n;i++){
x=read(),y=read();
addedge(x,y),addedge(y,x);
}
dfs(1,0);
print(ans),putchar('\n');
for(int i=1;i<=m;i++){
x=read(),y=read();modify(x,y);
print(ans),putchar('\n');
}
return 0;
}

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

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

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

  2. 「ZJOI2018」历史

    「ZJOI2018」历史 前置知识 \(\text{LCT}\) 维护子树信息,考虑辅助树上一个节点的子树信息只是其代表的这一段链的信息,设 \(S(u)\) 为节点 \(u\) 的子树信息,那么在辅 ...

  3. LOJ #2434. 「ZJOI2018」历史(LCT)

    题意 click here 题解 我们首先考虑答案是个什么样的东西, 不难 发现每个点可以单独计算它的贡献. 令每个点 \(i\) 崛起次数为 \(a_i\) . 假设一个点子树的 \(\sum a_ ...

  4. @loj - 2434@ 「ZJOI2018」历史

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...

  5. 题解 「ZJOI2018」历史

    题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...

  6. 「ZJOI2018」胖(ST表+二分)

    「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...

  7. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  8. 「TJOI2015」旅游 解题报告

    「TJOI2015」旅游 LCT沙比题 考虑我们其实是在维护一条链的\(\max\limits_{i<j} v_j-v_i\) 每次直接拿左右子树更新一下就可以了 写的时候把两个方向都维护一下, ...

  9. 「数据结构」Link-Cut Tree(LCT)

    #1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 ...

随机推荐

  1. 七牛存储qshell工具

    ---恢复内容开始--- 工具地址:https://developer.qiniu.com/kodo/tools/1302/qshell 下载完成后:根据自己的系统选择需要的可执行文件,支持linux ...

  2. cocoapods 安装中出的太多问题

    前言: 新欢的公司,新买的电脑,新安装 cocoapods.然后开开心心去百度如何安装 cocoapods,前面的步骤我就不说了. 在 pod setup 上之后,网速超慢然后就失败 fatal: T ...

  3. PL/SQL链接Oracle出现乱码

    1.用Pl/sql时,中文注释是乱码,需要查看下oracle server端的字符集. SQL语句:select userenv('language') from dual 结果:SIMPLIFIED ...

  4. node 常用模块及方法fs,url,http,path

    http://www.cnblogs.com/mangoxin/p/5664615.html https://www.liaoxuefeng.com/wiki/001434446689867b2715 ...

  5. &#65279导致网页顶部空白一行的解决办法【实测有效】

    我用织梦做的网站,出现了&#65279导致网页顶部空白一行的问题.通过搜索,了解到这原来是UTF-8的BOM的问题. &#65279导致网页顶部空白一行原因 这个问题只会在chrome ...

  6. 选择文件,显示其路径在ListBox控件里

    private void btnSelect_Click(object sender, EventArgs e)        {            lbxFiles.Items.Clear(); ...

  7. 关于签名sign的坑

    在有些支付文档或其他文档都会要求签名验证 /** * description:签名 * function name:sign * @param $data * @return string */fun ...

  8. amazeui分页

    <link rel="stylesheet" href="../../static/css/manage/amazeui.min.css" /> & ...

  9. Linux学习---类型修饰符

    auto eg:aoto int a;   默认情况--------->分配的内存可读可写的区域. register eg:register int a; 限制变量定义在寄存器上的修饰符 定义一 ...

  10. (PMP)解题技巧和典型题目分析(0903-3班)

    B.项目有依赖 D A A B B C B C D B A B B A B