LOJ558 我们的 CPU 遭到攻击 LCT
题意:写一个数据结构,支持森林上:连边、删边、翻转点的颜色(黑白)、查询以某一点为根的某棵树上所有黑色点到根的距离和。$\text{点数} \leq 10^5 , \text{操作数} \leq 3 \times 10^5$
连边删边不用说就是$LCT$,而边有边权,显然需要化边为点进行操作
考虑如何维护最后一个信息。考虑$LCT$中$Splay$上的某一棵子树,$Splay$的根为$x$,其左子树为$lson$,右子树为$rson$,虚子树统一称为$son$
如果我们已经计算好了$lson,rson,son$的答案,如何计算$x$的答案?
因为$Splay$上对应原树的一条链,所以:
①$rson$与$son$中的黑点在需要经过左子树中的所有边和$x$(如果$x$代表一条边),所以答案需要加上$rson$与$son$中的黑点总数$\times\,$($x$代表的边的边权$+lson$中的实链边权总和)
②如果$x$代表一个黑点,它需要经过左子树中的所有边,所以答案需要加上$lson$中的实链边权总和
③答案再加上$lson,rson,son$的答案即可。
所以我们需要维护子树的边权总和、黑点总数,才能够计算答案。
需要注意以下几点:
①边权总和不需要将虚子树的计算在内(显然虚子树内的点都在虚子树上传的时候计算完了答案,所以在其他点上不会产生贡献),只需要把实链的计算上去
②因为需要$makeroot$操作,所以你还要记录将左右子树反过来之后的答案,这样才能正确下传标记
③注意一点:翻转左右子树对虚子树内部答案没有影响,所以虚子树答案直接上传不经过翻转的即可
#include<bits/stdc++.h>
#define lch Tree[x].ch[0]
#define rch Tree[x].ch[1]
#define int long long
//This code is written by Itst
using namespace std;
inline int read(){
;
;
char c = getchar();
while(c != EOF && !isdigit(c)){
if(c == '-')
f = ;
c = getchar();
}
while(c != EOF && isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return f ? -a : a;
}
;
struct node{
] , size , non_size;
long long val , sumE , sumL , non_sum , sumR;
bool mark , col;
}Tree[MAXN << ];
int N , M , K , cntNode;
inline bool nroot(int x){
] == x || Tree[Tree[x].fa].ch[] == x;
}
inline bool son(int x){
] == x;
}
inline void pushup(int x){
Tree[x].size = Tree[lch].size + Tree[rch].size + Tree[x].non_size + Tree[x].col;
Tree[x].sumE = Tree[lch].sumE + Tree[rch].sumE + Tree[x].val;
Tree[x].sumL = Tree[lch].sumL + Tree[rch].sumL + Tree[x].non_sum +(Tree[rch].size + Tree[x].non_size + Tree[x].col) * (Tree[x].val + Tree[lch].sumE);
Tree[x].sumR = Tree[lch].sumR + Tree[rch].sumR + Tree[x].non_sum + (Tree[lch].size + Tree[x].non_size + Tree[x].col) * (Tree[x].val + Tree[rch].sumE);
}
inline void rotate(int x){
bool f = son(x);
];
if(nroot(y))
Tree[z].ch[son(y)] = x;
Tree[x].fa = z;
Tree[x].ch[f ^ ] = y;
Tree[y].fa = x;
Tree[y].ch[f] = w;
if(w)
Tree[w].fa = y;
pushup(y);
}
inline void reverse(int x){
Tree[x].mark ^= ;
swap(lch , rch);
swap(Tree[x].sumL , Tree[x].sumR);
}
inline void pushdown(int x){
if(Tree[x].mark){
reverse(lch);
reverse(rch);
Tree[x].mark = ;
}
}
void pushdown_all(int x){
if(nroot(x))
pushdown_all(Tree[x].fa);
pushdown(x);
}
inline void Splay(int x){
pushdown_all(x);
while(nroot(x)){
if(nroot(Tree[x].fa))
rotate(son(Tree[x].fa) == son(x) ? Tree[x].fa : x);
rotate(x);
}
pushup(x);
}
inline void access(int x){
; x ; y = x , x = Tree[x].fa){
Splay(x);
Tree[x].non_size = Tree[x].non_size + Tree[Tree[x].ch[]].size - Tree[y].size;
Tree[x].non_sum = Tree[x].non_sum + Tree[Tree[x].ch[]].sumL - Tree[y].sumL;
Tree[x].ch[] = y;
pushup(x);
}
}
inline void makeroot(int x){
access(x);
Splay(x);
reverse(x);
}
inline void split(int x , int y){
makeroot(x);
access(y);
Splay(y);
}
inline void _link(int x , int y){
makeroot(x);
makeroot(y);
Tree[y].non_size += Tree[x].size;
Tree[y].non_sum += Tree[x].sumL;
Tree[x].fa = y;
pushup(y);
}
inline void link(int x , int y , int val){
Tree[++cntNode].val = val;
_link(x , cntNode);
_link(y , cntNode);
}
inline void cut(int x , int y){
split(y , x);
if(Tree[y].fa == x){
Tree[y].ch[] = ;
pushup(y);
}
else
Tree[y].fa = Tree[Tree[y].fa].ch[] = ;
lch = Tree[lch].fa = ;
pushup(x);
}
inline void query(int x){
makeroot(x);
printf("%lld\n" , Tree[x].sumL);
}
inline char getc(){
char c = getchar();
while(!isupper(c))
c = getchar();
return c;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("558.in" , "r" , stdin);
freopen("558.out" , "w" , stdout);
#endif
N = read();
M = read();
K = read();
cntNode = N;
int a , b , w;
while(M--){
a = read();
b = read();
w = read();
link(a , b , w);
}
while(K--)
switch(getc()){
case 'L':
a = read();
b = read();
w = read();
link(a , b , w);
break;
case 'C':
a = read();
b = read();
cut(a , b);
break;
case 'F':
a = read();
makeroot(a);
Tree[a].col ^= ;
pushup(a);
break;
case 'Q':
query(read());
break;
}
;
}
LOJ558 我们的 CPU 遭到攻击 LCT的更多相关文章
- loj558 「Antileaf's Round」我们的CPU遭到攻击
考完了可以发题解了. 做法是link-cut tree维护子树信息,并不需要维护黑树白树那些的. 下面是一条重链: 如果4是根的话,那么在splay上是这样的: 在splay中,子树的信息都已经计算完 ...
- LCT总结——应用篇(附题单)(LCT)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...
- 【转载】LCT题单
本篇博客的题单转载自FlashHu大佬的博客:LCT总结--应用篇(附题单)(LCT). 关于\(LCT\)可以查看这篇博客:\(LCT\)入门. 这里面有些题解的链接是空链接,尚未补全. 维护链信息 ...
- LCT 入门
这是一份 \(\rm LCT\) 入门总结. 关于 \(\rm LCT\) 的复杂度这里不会提及,只会记录 \(\rm LCT\) 的基本操作和经典例题,但神奇的 \(\rm LCT\) 虽然常数巨大 ...
- 【H3C交换机】cpu各个进程的详细说明
display cpu-usage命令用来查看设备CPU占用率的统计信息,以及各个进程的cpu占用率. 各个进程详细说明如下,不同软件版本.盒式和框式的cpu进程略有不同,详细信息可以查看手册中的命令 ...
- 关于 Spring Security 5 默认使用 Password Hash 算法
账户密码存储的安全性是一个很老的话题,但还是会频频发生,一般的做法是 SHA256(userInputpwd+globalsalt+usersalt) 并设置密码时时要求长度与大小写组合,一般这样设计 ...
- A Survey on the Security of Stateful SDN Data Planes
论文摘要: 本文为读者提供新兴的SDN带状态数据平面,集中关注SDN数据平面编程性带来的隐患. I部分 介绍 A.带状态SDN数据平面的兴起 B.带状态数据平面带来的安全隐患 引出带状态数据平面的安全 ...
- Bitcoin: A Peer-to-Peer Electronic Cash System(比特币论文翻译)
比特币历史: 2008年,比特币论文诞生 2009年1月,第一批比特币诞生 2011年4月,比特币价格第一次达到了1美元 2011年6月,涨到30美元,然后开始跌 2013年1月,4美元 2013年1 ...
- CVE-2019-0708 漏洞分析及相关测试
在CVE-2019-0708公布后几天就已经尝试过复现该漏洞,但借助当时exp并没能成功复现反弹shell的过程遂放弃,故借助这次漏洞复现报告再来尝试复现该漏洞,因为还在大三学习中,有很多知识还没有掌 ...
随机推荐
- 02--css背景与边框--css揭秘
背景与边框 一 半透明边框 rgba/hsla颜色 1.难题 假设我们想给一个容器设置一层白色背景和一道半透明白色边框,body 的背景会从它的半透明边框透上来.我们最开始的尝试可能是这样的: #bo ...
- Ansible--配置文件及系列命令
Ansible目录结构 安装完成ansible后要知道ansible主要安装的了什么,安装的目录结构是什么,每个目录做什么的 可以使用:rpm -ql ansible | less 来查看ansibl ...
- Expo大作战(四十)--expo sdk api之 Calendar,Constants
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- [Hadoop] Windows 下的 Hadoop 2.7.5 环境搭建
原文地址:https://www.cnblogs.com/memento/p/9148721.html 准备说明: jdk:jdk-8u161-windows-x64.exe hadoop:hadoo ...
- Django 添加mdia文件目录路径
1.settings.py MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 2.urls.py from djan ...
- JdbcTemplate学习笔记(更新插入删除等)
1.使用JdbcTemplate的execute()方法执行SQL语句 jdbcTemplate.execute("CREATE TABLE USER (user_id integer, n ...
- Vim命令图解及快捷键讲解
快捷键详解
- [HDFS_add_2] SecondaryNameNode 滚动 NameNode 数据流程
0. 说明 在 将 SecondaryNameNode 配置到 s105 节点上 的基础上进行 SecondaryNameNode 滚动 NameNode 数据流程 分析 1. SecondaryNa ...
- sublime text 中 .vue文件中的scss语法无法高亮bug怎么解决
如题,在vuejs的单文件组件中,.vue 结尾的文件里面使用scss的时候,无法高亮.因为 sublime默认是不带sass语法高亮的,安装 sublime SCSS语法高亮包即可. 方法如下: ...
- lvm管理卷之缩减卷大小
最近刚刚装好了一个系统,但是因为没有分好区,导致home分区过大,所以想把home分区的一大半移动到根分区里面. 1.先说一下我的环境. 安装的是centos6版本的系统,使用的默认文件系统是ext4 ...