「ZJOI2018」历史
「ZJOI2018」历史
前置知识
\(\text{LCT}\) 维护子树信息,考虑辅助树上一个节点的子树信息只是其代表的这一段链的信息,设 \(S(u)\) 为节点 \(u\) 的子树信息,那么在辅助树上我们维护的是:
\]
考虑它们的实际意义 \(lson\) 是 \(u\) 的父亲,\(rson\) 是 \(u\) 的重儿子,显然 \(S(lson)\) 是我们不需要的,而真正的辅助信息只算了节点本身和重儿子。
考虑按照这样算的话, \(u\) 的每一个轻儿子代表的子树信息都是合法的,那么可以再开一个 \(vs(u)\) 把所有轻儿子的 \(S\) 加上去。
\]
轻重链切换的时候暴力更新一下 \(vs(u)\) 即可,动态加边的话因为要影响虚边,要把两个点都 \(\text{makeroot}\) 来保证更新的 \(vs(u)\) 合法,删边的话因为保证了关系是重儿子,所以直接做就好了,\(access\) 切换轻重边的时候需要重新维护一下。
但这种做法适用范围不大,信息不可减就做不了,只能单点不断条重链修改,然而对这道题来说已经足够了。
解题思路
观察发现每个节点的贡献是独立的,同一个儿子内的连续多次崛起不会贡献新的代价。显然要最大化每个节点的贡献需要尽可能两次崛起位于不同的儿子的子树。
设节点 \(u\) 的子树 \(a_i\) 和为 \(sz(u)\) ,\(mson=\max(\max_{u\rightarrow v}sz(v), a(u))\) 。
如果 \(2mson\leq sz(u)\) ,那么显然可以构造出操作序列满足不会有连续相同,贡献就是 \(sz(u)-1\)。
否则可以贪心的考虑,尽可能多用 \(mson\) ,节点 \(u\) 的贡献就是 \(2(sz(u)-mson)\)。
如果 \(u\) 的一个儿子 \(v\) 满足 \(2sz(v)>sz(u)\) ,那么我们记 \(u\rightarrow v\) 这条边为重边,其余边为轻边,类似于树链剖分和 \(\text{LCT}\) 的结构。
然后我们可以得到一些基本推论。
- 一个节点向下只会至多有一条重边。
- 一个节点到根的路径上只会至多有 \(log_{na_i}\) 条轻边,因为每有一条轻边 \(sz(u)\) 至少减少二分之一。
观察发现每一次修改操作,路径上的重边仍旧是重边,所以贡献不变,路径上的轻边可能会发生改变,只需要找到这些轻边暴力改就好了。
前面说了这个结构和 \(\text{LCT}\) 很类似,只需要每条重链用辅助树维护,支持单点加求一个点在根为 \(1\) 时的子树和,以及找一个点到一条路径上的轻边。
前面两个要求 \(\text{LCT}\) 维护子树信息可以直接做,查询只需要类似 \(access\) 走一遍,但是不要强制断开原有的重边,而是对于每条轻边按照前置知识的方法更新子树和再判断,细节有点多。
复杂度的话,单次修改 \(\text{splay}\) 重链条数次,轻边条数是 \(O(log_{na_i})\) ,和正常的 \(\text{LCT}\) 没啥区别,套用那个的均摊分析就是 \(\mathcal O(nlogn)\) 。
code
/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 800005;
vector<int> g[N];
int ch[N][2], fa[N], n, m;
ll vs[N], a[N], s[N], ans;
#define son(x) (ch[fa[x]][1] == x)
#define isr(x) (ch[fa[x]][0] != x && ch[fa[x]][1] != x)
inline void update(int u){ s[u] = s[ch[u][0]] + s[ch[u][1]] + a[u] + vs[u]; }
inline void rotate(int x){
int F = fa[x], G = fa[F], w = son(x);
if(!isr(F)) ch[G][son(F)] = x; fa[x] = G;
ch[F][w] = ch[x][w^1], fa[ch[x][w^1]] = F;
ch[x][w^1] = F, fa[F] = x, update(F);
}
inline void splay(int x){
for(int F = fa[x]; !isr(x); rotate(x), F = fa[x])
if(!isr(F)) rotate(son(F) == son(x) ? F : x);
update(x);
}
inline ll calc(int x, ll t, ll h){
return ch[x][1] ? ((t - h) << 1) : ((a[x] << 1) > t ? ((t - a[x]) << 1) : t - 1);
}
inline void access(int x, int w){
splay(x);
ll now = s[x] - s[ch[x][0]], mson = s[ch[x][1]];
ans -= calc(x, now, mson), s[x] += w, a[x] += w, now += w;
if((mson << 1) <= now) vs[x] += mson, ch[x][1] = mson = 0;
ans += calc(x, now, mson), update(x);
int c = x; x = fa[x];
for(; x; c = x, x = fa[x]){
splay(x);
ll now = s[x] - s[ch[x][0]], mson = s[ch[x][1]];
ans -= calc(x, now, mson), s[x] += w, vs[x] += w, now += w;
if((mson << 1) <= now) vs[x] += mson, ch[x][1] = mson = 0;
if((s[c] << 1) > now) vs[x] -= (mson = s[c]), ch[x][1] = c;
ans += calc(x, now, mson), update(x);
}
}
inline void dfs(int u){
s[u] = a[u];
for(int i = 0; i < (int) g[u].size(); i++)
if(g[u][i] != fa[u]) fa[g[u][i]] = u, dfs(g[u][i]), s[u] += s[g[u][i]];
for(int i = 0; i < (int) g[u].size(); i++)
if(g[u][i] != fa[u] && s[g[u][i]] * 2 > s[u]) ch[u][1] = g[u][i];
vs[u] = s[u] - a[u] - s[ch[u][1]];
ans += calc(u, s[u], s[ch[u][1]]);
}
int main(){
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i]);
for(int i = 1, x, y; i < n; i++){
read(x), read(y);
g[x].push_back(y), g[y].push_back(x);
}
dfs(1);
printf("%lld\n", ans);
for(int i = 1, x, y; i <= m; i++){
read(x), read(y), access(x, y);
printf("%lld\n", ans);
}
return 0;
}
「ZJOI2018」历史的更多相关文章
- 「ZJOI2018」历史(LCT)
「ZJOI2018」历史(LCT) \(ZJOI\) 也就数据结构可做了-- 题意:给定每个点 \(access\) 次数,使轻重链切换次数最大,带修改. \(30pts:\) 挺好想的.发现切换次数 ...
- @loj - 2434@ 「ZJOI2018」历史
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...
- 题解 「ZJOI2018」历史
题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...
- LOJ #2434. 「ZJOI2018」历史(LCT)
题意 click here 题解 我们首先考虑答案是个什么样的东西, 不难 发现每个点可以单独计算它的贡献. 令每个点 \(i\) 崛起次数为 \(a_i\) . 假设一个点子树的 \(\sum a_ ...
- LOJ2434. 「ZJOI2018」历史 [LCT]
LOJ 思路 第一眼看似乎没有什么思路,试着套个DP上去:设\(dp_x\)表示只考虑\(x\)子树,能得到的最大答案. 合并的时候发现只有\(x\)这个点有可能做出新的贡献,而做出新贡献的时候必然是 ...
- 「ZJOI2018」胖(ST表+二分)
「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...
- Loj #2529. 「ZJOI2018」胖
Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...
- 「JOISC 2014 Day1」 历史研究
「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...
- 「2014-2-26」Unicode vs. UTF-8 etc.
目测是个老问题了.随便一搜,网上各种总结过.这里不辞啰嗦,尽量简洁的备忘一下. 几个链接,有道云笔记链接,都是知乎上几个问题的摘录:阮一峰的日志,1-5 还是值得参考,但是之后的部分则混淆了 Wind ...
随机推荐
- 说说ASP.NET的IsPostBack
学习asp.net,就不能不谈IsPostBack属性,顾名思义,这是是否回发的意思,多用于判断是不是第一次打开 一.IsPostBack介绍 Page.IsPostBack是一个标志:当前请求是否第 ...
- C.Fountains(Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)+线段树+RMQ)
题目链接:http://codeforces.com/contest/799/problem/C 题目: 题意: 给你n种喷泉的价格和漂亮值,这n种喷泉题目指定用钻石或现金支付(分别用D和C表示),C ...
- hdu 2063 过山车 二分匹配(匈牙利算法)
简单题hdu2063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Ot ...
- JavaScript 判断手机端访问并跳转 redirect mobile
假如你的手机端网站在 /m 目录下 (function(a,b){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer| ...
- [003] largest_subarray_with_equal_1&0
[Description] Given an array with only '1' and '0', find a largest length sub-array which contains e ...
- P3960 列队
这是NOIP 2017最后一道题 不知道这道题有没有人代码写的和我一样麻烦. Solution 30分暴力 维护每行每列的元素. 每次删除一个元素的时候, 需要修改一行一列 因此复杂度上界\(O(nm ...
- 以太坊go-ethereum项目源码本地环境搭建
如果要深入了解go-ethereum项目的实现与机制,看源代码是必不可少的.今天这篇博客就简单介绍一下如何在本地搭建项目的开发环境. GO语言环境搭建 以win8为例,访问地址https://gola ...
- Django admin后台操作
Django提供自动后台管理应用,简称admin. admin是一个应用,每个Web站点都需要它.admin通过让开发者可以在完成完整的UI之前验证处理数据的代码. 设置admin 打开setting ...
- Hilite代码高亮工具
在用<有道云笔记>等软件时候,软件自身不提供代码高亮功能,对于需要记录code的学习笔记,视觉效果丢失. 有很多在线工具能用来代码高亮,比如oschina就有代码高亮页面用于着色. 但是我 ...
- Windows下的字体美化
转自HJK的博客 许多人钟情于Mac很大一部分是因为Mac优雅的字体渲染,Windows原生的效果很难做得到,即便是开启了CleartType效果也不尽如人意.不论是微软本身的审美原因还是历史包袱,与 ...