当前位置: 首页 > news >正文

[国家集训队] Tree II 题解报告

[国家集训队] Tree II

一道·真·板子·题

就是练习LCT懒标记的题目

除了翻转标记以外还要维护乘法标记和加法标记

注意加法标记和乘法标记的维护!!!

加法标记

因为splay的区间大小不是固定的,所以我们要维护size,并且子树的sum要加上size乘上标记

其他的就只用直接加上即可

void pushadd(ll x,ll c){t[x].sum=(t[x].sum+t[x].sz*c%P)%P;t[x].val=(t[x].val+c)%P;t[x].add=(t[x].add+c)%P;
}
乘法标记

由于乘法的优先级要大于加法

所以我们的加法标记也要乘上乘法标记值

void pushmul(ll x,ll c){t[x].sum=t[x].sum*c%P;t[x].val=t[x].val*c%P;t[x].mul=t[x].mul*c%P;t[x].add=t[x].add*c%P;
}

注意:int过不了!!!

CODE
#include<bits/stdc++.h> 
#define ll long long
using namespace std;
const ll N=1e5+2,P=51061;
ll n,q,s[N];
struct node{ll ch[2],p,sum,tag,sz,val,mul,add;}t[N];
void pushtag(ll x){swap(t[x].ch[0],t[x].ch[1]);t[x].tag^=1;
}
void pushmul(ll x,ll c){t[x].sum=t[x].sum*c%P;t[x].val=t[x].val*c%P;t[x].mul=t[x].mul*c%P;t[x].add=t[x].add*c%P;
}
void pushadd(ll x,ll c){t[x].sum=(t[x].sum+t[x].sz*c%P)%P;t[x].val=(t[x].val+c)%P;t[x].add=(t[x].add+c)%P;
}
void pushup(ll x){t[x].sum=(t[t[x].ch[0]].sum+t[x].val+t[t[x].ch[1]].sum)%P;t[x].sz=t[t[x].ch[0]].sz+t[t[x].ch[1]].sz+1;
}void pushdown(ll x){if(t[x].mul!=1){pushmul(t[x].ch[0],t[x].mul);pushmul(t[x].ch[1],t[x].mul);t[x].mul=1;}if(t[x].add){pushadd(t[x].ch[0],t[x].add);pushadd(t[x].ch[1],t[x].add);t[x].add=0;}if(t[x].tag){pushtag(t[x].ch[0]);pushtag(t[x].ch[1]);t[x].tag=0;}
}
bool isrt(ll x){//判断节点x是否是当前实树的根return t[t[x].p].ch[0]!=x&&t[t[x].p].ch[1]!=x;
}
void rotate(ll x){//x上旋 ll y=t[x].p,z=t[y].p;ll k=(t[y].ch[1]==x);//x原来的位置 if(!isrt(y)) t[z].ch[(t[z].ch[1]==y)]=x;//x代替y位置 t[x].p=z;t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].p=y;t[x].ch[k^1]=y;t[y].p=x;pushup(y);pushup(x);
}
void splay(ll x){//x上旋到根 ll top=0,r=x;s[++top]=r;while(!isrt(r)){s[++top]=r=t[r].p;}while(top) pushdown(s[top--]);while(!isrt(x)){ll y=t[x].p,z=t[y].p;if(!isrt(y)){//y不为目标位置 if((t[y].ch[1]==x)^(t[z].ch[1]==y)) rotate(x);//不在同一直线上 else rotate(y);//在同一直线上 }rotate(x);}
}
void access(ll x){// 把根节点到x的路径上的边全部变为实边,同时将x变成splay的根节点ll z=x;for(ll y=0;x;y=x,x=t[x].p){splay(x);t[x].ch[1]=y;//右子树 pushup(x);}splay(z);
}
void makert(ll x){// 将x变成原树的根节点access(x);//打通一条从根到x的路径 然后将x旋到根 //首先 打通一条从根到x的路径 后 x 是 d最大的点 //因此 此时,x必然是Splay中中序遍历最后得到的点 pushtag(x);//翻转Splay , x成为 中序遍历 第一个点->即原树根节点 
}
ll findrt(ll x) {// 找到x所在原树的根节点, 再将原树的根节点旋转到splay的根节点access(x);//x与原树根在同一splay内//由于每个Splay中维护的节点按中序遍历得到的顺序在原树中深度依次增加1//所以根节点必然是Splay中序遍历顺序为1的节点while(t[x].ch[0]){pushdown(x);x=t[x].ch[0];}//路径深度最小 splay(x);return x;
}
void split(ll x,ll y){ // 给x和y之间的路径建1个splay,其根节点是ymakert(x);access(y);
}
void link(ll x,ll y){//如果x和y不连通,加1条x和y之间的边makert(x);// 将x作为它所在树的根if(findrt(y)!=x){//不连通 t[x].p=y;//更新x的父亲为y}
}
bool back(ll x,ll y){//y是否是x的后继 return t[x].ch[1]==y&&!t[y].ch[0];
}
void cut(ll x,ll y){// 如果x和y之间存在边,则删除该边split(x,y);//只剩下x->y,x是y的做儿子 if(t[x].ch[1]||t[x].p!=y||t[y].ch[1])return ;t[t[y].ch[0]].p=0;t[y].ch[0]=0;
}
int main(){scanf("%lld%lld",&n,&q);for(ll i=1;i<=n;i++){t[i].val=t[i].sz=t[i].mul=1;}for(ll i=1,x,y;i<n;i++){scanf("%lld%lld",&x,&y);link(x,y);}for(ll i=1;i<=q;i++){char op[10];ll x,y,k;scanf("%s",op);if(op[0]=='+'){scanf("%lld%lld%lld",&x,&y,&k);split(x,y),pushadd(y,k);}else if(op[0]=='-'){scanf("%lld%lld",&x,&y);cut(x,y);scanf("%lld%lld",&x,&y);link(x,y);}else if(op[0]=='*'){scanf("%lld%lld%lld",&x,&y,&k);split(x,y),pushmul(y,k);}else{scanf("%lld%lld",&x,&y);split(x,y);printf("%lld\n",t[y].sum);}}return 0;
} 

完结撒花❀
★,°:.☆( ̄▽ ̄)/$:.°★

相关文章:

[国家集训队] Tree II 题解报告

[国家集训队] Tree II 一道真板子题 就是练习LCT懒标记的题目 除了翻转标记以外还要维护乘法标记和加法标记 注意加法标记和乘法标记的维护&#xff01;&#xff01;&#xff01; 加法标记 因为splay的区间大小不是固定的&#xff0c;所以我们要维护size&#xff0c;并且…...

【redis】docker搭建redis集群

docker搭建redis集群&#xff0c;超级简单方便。 # 1. 拉取redis. 目前我拉取最新的是7.0.12 docker pull redis # 2. 下载配置文件 wget https://raw.githubusercontent.com/redis/redis/7.0/redis.conf # 3. 移到对应目录 mkdir -p /opt/docker/redis mv redis.conf /opt/d…...

前端个人年度工作述职报告(二十篇)

前端个人年度工作述职报告篇1 尊敬的各位领导、各位同仁&#xff1a; 大家好!按照20__年度我公司就职人员工作评估的安排和要求&#xff0c;我认真剖析、总结了自己的工作情况&#xff0c;现将本人工作开展情况向各位领导、同仁做以汇报&#xff0c;有不妥之处&#xff0c;希…...

TypeScript 编译配置

TypeScript的编译配置&#xff1a; 对单独一个ts文件进行监听编译 可使用tsc demo.ts -w 如果想对所有ts文件进行监听编译&#xff0c;监听到变化就自己编译&#xff0c;可以直接创建一个tsconfig.json文件。内容空着也OK&#xff1a;{}&#xff0c;执行 tsc 或 tsc -w 如果有…...

使用DMA传输实现单片机高效串口转发——以STM32系列为例

使用DMA传输实现单片机高效串口转发——以STM32系列为例 DateAuthorVersionNote2023.08.06Dog TaoV1.01. 完成了文档的撰写。 文章目录 使用DMA传输实现单片机高效串口转发——以STM32系列为例应用场景实现流程源码示例串口与中断配置DMA外设配置DMA发送数据函数串口中断服务函…...

一文了解 Android Auto 车载开发~

作者&#xff1a;牛蛙点点申请出战 背景 我的的产品作为一个海外音乐播放器&#xff0c;在车载场景听歌是一个很普遍的需求。在用户反馈中&#xff0c;也有很多用户提到希望能在车上播放音乐。同时车载音乐也可以作为提升用户消费时长一个抓手。 出海产品&#xff0c;主要服务…...

Pixel4 安卓源码及内核修改编译教程 | 基于Android12 AOSP

之前整理了 Pixel4上的源码过程&#xff0c;下载的话大家可以去镜像网站下载&#xff0c;可以节约很多时间。 实验设备&#xff1a;Ubuntu18.04 32G2T Pixel4 文章目录 一、安卓源码下载1.准备下载环境&#xff08;1&#xff09;安装Python 3.9&#xff08;2&#xff09;安装g…...

如何做好Code Review

本文主要从我们为什么需要CR&#xff1f;CR面临哪些挑战&#xff1f;CR的最佳实践几个方面分析&#xff0c;希望可以给读者一些参考。 为什么需要CR&#xff1f; 代码质量 定性来看&#xff0c;大家都认可Code Review&#xff08;后文简称CR&#xff09;能显著改善代码质量&…...

Unity技术框架集合、Unity技术栈汇总

引擎技术尝试 [Animancer-Pro] (https://assetstore.unity.com/packages/tools/animation/animancer-pro-116514) (基于Playable的简单强大的动画解决方案)[ProBuilder/UModeler] (https://assetstore.unity.com/packages/tools/modeling/umodeler-80868) (快速关卡原型构建…...

安卓SDK开发的一些疑问

目前&#xff0c;公司需要开发一套iOS和安卓的sdk&#xff0c;主要包含蓝牙管理、网络请求、倒计时等方案执行、蓝牙数据交互等功能。之前没有过开发安卓sdk的经历&#xff0c;写个笔记用以记录。 现在iOS sdk已经写了一部分&#xff0c;安卓开发我也习惯从iOS的角度类比来开发…...

【基础类】—三栏页面布局的方案和优缺点

一、假设高度已知&#xff0c;中间宽度自适应&#xff0c;三栏&#xff08;列&#xff09;布局的方案有哪些&#xff1f; float浮动、absolute绝对定位、flex弹性盒子、table表格布局、grid网格布局 浮动 float <style>* {margin: 0;padding: 0;}.container {width: 1…...

OPENCV C++(四)形态学操作+连通域统计

形态学操作 先得到一个卷积核 Mat kernel getStructuringElement(MORPH_RECT,Size(5,5)); 第一个是形状 第二个是卷积核大小 依次为腐蚀 膨胀 开运算 闭运算 Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…...

tomcat上部署jpress

一.确保有jdk&#xff0c;tomcat和mysql环境 二.新建jpress数据库&#xff0c;新建jpress用户并赋予所有权限 三.将jpress的war上传到tomcat/apache-tomcat-8.5.70/webapps&#xff0c;具体根据你的实际tomcat安装路径为准&#xff0c;上传完成后他会自己解包 四.到浏览器完…...

篇十:外观模式:简化复杂系统

篇十&#xff1a;“外观模式&#xff1a;简化复杂系统” 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&#xff0c;分…...

linux gcc __attribute__

__attribute__ 1. 函数属性1.1 __attribute__((noreturn))1.2 __attribute__((format))1.3 __attribute__((const)) 2. 变量属性2.1. __attribute__((aligned))2.2. __attribute__((packed)) 3. 类型属性 __attribute__ 是 GCC 编译器提供的一种特殊语法&#xff0c;它可以用于…...

【SpringCloud】RabbitMQ基础

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;…...

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…...

Python识别抖音Tiktok、巨量引擎滑块验证码识别

由于最近比较忙&#xff0c;所以本周搞了一个相对简单的验证码&#xff0c;就是抖音Tiktok的滑块验证码&#xff0c;这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果&#xff1a; 验证码识别过程 1、利用爬虫采集图…...

EvilBox One靶场笔记

EvilBox: One靶场笔记 信息收集 先fscan找主机192.168.1.102 namp扫端口 开放80,22端口 然后扫目录 └─$ gobuster dir -r -u http://192.168.1.102/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak,html在扫secret目录&#xff0c;找…...

shell脚本中的export无效

写了一段shell脚本&#xff1a; #!/bin/bash source Tools/simulation/gazebo-classic/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:$(pwd) export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:$(pwd)/Tools/simulation/gazebo…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...