「ZJOI2018」历史(LCT)
「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)的更多相关文章
- LOJ2434. 「ZJOI2018」历史 [LCT]
LOJ 思路 第一眼看似乎没有什么思路,试着套个DP上去:设\(dp_x\)表示只考虑\(x\)子树,能得到的最大答案. 合并的时候发现只有\(x\)这个点有可能做出新的贡献,而做出新贡献的时候必然是 ...
- 「ZJOI2018」历史
「ZJOI2018」历史 前置知识 \(\text{LCT}\) 维护子树信息,考虑辅助树上一个节点的子树信息只是其代表的这一段链的信息,设 \(S(u)\) 为节点 \(u\) 的子树信息,那么在辅 ...
- LOJ #2434. 「ZJOI2018」历史(LCT)
题意 click here 题解 我们首先考虑答案是个什么样的东西, 不难 发现每个点可以单独计算它的贡献. 令每个点 \(i\) 崛起次数为 \(a_i\) . 假设一个点子树的 \(\sum a_ ...
- @loj - 2434@ 「ZJOI2018」历史
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...
- 题解 「ZJOI2018」历史
题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...
- 「ZJOI2018」胖(ST表+二分)
「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...
- Loj #2529. 「ZJOI2018」胖
Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...
- 「TJOI2015」旅游 解题报告
「TJOI2015」旅游 LCT沙比题 考虑我们其实是在维护一条链的\(\max\limits_{i<j} v_j-v_i\) 每次直接拿左右子树更新一下就可以了 写的时候把两个方向都维护一下, ...
- 「数据结构」Link-Cut Tree(LCT)
#1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 ...
随机推荐
- HTTPClient to use http/https protocol to send request
使用了spring boot, gradle, commons-httpcomponent3. 目前httpclient 已经有了版本4. https://github.com/lvfe/httpCl ...
- 使用CSV控件方法实现参数化
一.录制脚本 二.下面介绍如何使用CSV控件方法实现参数化 1. 添加-->配置元件-->csv Data Set Config Filename:文件的来源 Variable Name ...
- mysql 函数介绍
含义 一组预先编译好的SQL语句集合,可以理解成批处理语句 提高代码的重用性 简化操作 减少了编译次数并且减少了和数据库服务器的连接次数, 提高了效率 区别 : 存储过程:可以有0个返回,也可以有多个 ...
- mysql约束以及数据库的修改
一.约束 1.约束保证数据完整性和一致性. 2.约束分为表级约束和列级约束. (1)表级约束(约束针对于两个或两个以上的字段使用) (2)列级约束(针对于一个字段使用) 3.约束类型有: (1)NOT ...
- [Presto]Presto章1 Presto 咋用
Presto 的平均查询性能是 Hive 的 10 倍! 由于 Presto 的数据源具有完全解耦.高性能,以及对 ANSI SQL 的支持等特性,使得 Presto 在 ETL.实时数据计算. Ad ...
- 图解Golang的GC算法
虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了. 以下是Golang GC算法的里程碑: v1.1 STW v1.3 Mar ...
- TensorFlow升级到1.13
win10下: 安装后import tensorflow出错:tensorflow/python/lib/core/bfloat16.cc:675] Check failed: PyBfloat16_ ...
- 检查SQL Server被哪个进程占用,且杀进程。
-----检查DB的名字---------------------------------------DECLARE @dbName varchar(50)SET @dbName='RegisterO ...
- spring切换多数据源
应用场景:在一个项目需要用到两个或两个以上的数据库时,要进行切换数据库,来操作相应的表. 框架:用的是spring 的org.springframework.jdbc.datasource.looku ...
- 【竞价网站绝技】根据访客ip,页面显示访客所属城市的html代码(借用YY IP地址库)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...