赛前训练 12 extra 树上差分倍增

news/2025/10/19 21:29:15/文章来源:https://www.cnblogs.com/XOF-0-0/p/19151458

A

树上差分板子.

B

每个点只有一条出边的有向图可以看作树

基于上述结论,我们直接倍增维护 \(\min,\operatorname{sum}\) 即可.

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;const int N=1e5+5,M=48;
int n,k;
vector<int> G[N];
int dp[N][M],mn[N][M],sum[N][M];void solve(int x){int m=k,cur=x,ansmn=1e18,anss=0;for(int j=34;j>=0;j--){if((1ll<<j)<=m){ansmn=min(ansmn,mn[cur][j]);anss+=sum[cur][j];cur=dp[cur][j];m-=(1ll<<j);}}cout<<anss<<' '<<ansmn<<'\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>k;memset(mn,0x3f,sizeof mn);for(int i=1,u;i<=n;i++){cin>>u,u++;dp[i][0]=u;}for(int i=1,w;i<=n;i++){cin>>w;mn[i][0]=sum[i][0]=w;}for(int j=1;j<=34;j++){for(int i=1;i<=n;i++){dp[i][j]=dp[dp[i][j-1]][j-1];mn[i][j]=min(mn[i][j-1],mn[dp[i][j-1]][j-1]);sum[i][j]=sum[i][j-1]+sum[dp[i][j-1]][j-1];}}for(int i=1;i<=n;i++)solve(i);return 0;
}

C

容易发现每个点前面第一个和它不互质的数组成的子串必须得分成一段,这个很显然可以双指针维护.

然后对于区间 \([l,r]\),我们可以暴力跳出有多少个区间,但这样是 \(\mathcal{O}(n)\) 的,考虑倍增加速即可.

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;const int N=1e5+5,V=1e5,M=48;
int n,tot,q;
int a[N],p[N],st[N][M];
bool vis[N],ok[N];
vector<int> s[N];void shai(){for(int i=2;i<=V;i++){if(!vis[i]){p[++tot]=i;for(int j=i*2;j<=V;j+=i)vis[j]=1;}}for(int i=1;i<=tot;i++)for(int j=p[i];j<=V;j+=p[i])s[j].emplace_back(i);
}
int qry(int l,int r){int res=0;for(int j=34;j>=0;j--){if(st[l][j]<=r){l=st[l][j];res+=(1ll<<j);}}res++;return res;
}
bool add(int x){for(int i:s[x])if(ok[i])return 0;for(int i:s[x])ok[i]=1;return 1;
}
void del(int x){if(!x)return;for(int i:s[x])ok[i]=0;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>q;for(int i=1;i<=n;i++)cin>>a[i];shai();for(int i=1,j=0;i<=n;i++){del(a[i-1]);while(j<n&&add(a[j+1]))j++;st[i][0]=j+1;}st[n+1][0]=n+1;for(int j=1;j<=34;j++){st[n+1][j]=n+1;for(int i=1;i<=n;i++)st[i][j]=st[st[i][j-1]][j-1];}while(q--){int l,r;cin>>l>>r;cout<<qry(l,r)<<'\n';}return 0;
}

D

对于一个节点,考虑其子树内和子树外的情形.

如果子树内有和当前节点相同的种类,则子树外的全部都得 ban,那个节点的兄弟们也得 ban,只有它自己子树内的不用 ban.

子树外的呢?画个图可以知道,只有那个子树外的节点到当前节点路径上中间的要 ban,结合上一种情形,我们发现只需要把当前节点的子树 ban 掉即可.

上述操作可以把树拍成序列后完成,搞完后做一遍前缀和即可.

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;const int N=2e5+5;
int n,ans,all;
int a[N],b[N],siz[N],cnt[N],tot[N],dfn[N],out[N],d[N],s[N];
vector<int> G[N];void dfs(int cur,int fa){siz[cur]=1;dfn[cur]=++all;int pre=cnt[a[cur]];cnt[a[cur]]++;for(int i:G[cur]){if(i==fa)continue;int tmp=cnt[a[cur]];dfs(i,cur);siz[cur]+=siz[i];if(tmp!=cnt[a[cur]]){d[1]++;d[dfn[i]]--;d[out[i]+1]++;}}out[cur]=all;if(cnt[a[cur]]-pre<tot[a[cur]]){d[dfn[cur]]++;d[out[cur]+1]--;}
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n;for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];sort(b+1,b+n+1);int len=unique(b+1,b+n+1)-b-1;for(int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+len+1,a[i])-b;tot[a[i]]++;}for(int i=1,u,v;i<n;i++){cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}dfs(1,0);int ans=0;for(int i=1;i<=n;i++){s[i]=s[i-1]+d[i];if(!s[i])ans++;}cout<<ans;return 0;
}

总结

  • 两个小技巧:

    双指针:维护子串信息

    倍增:加速跳跃过程

  • 树上问题:

    与图的转化(单出边有向图)

    与序列的转化(dfn 序)

    画图、考虑子树外和子树内

以上.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/940633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

塔吊施工人员操作合规性监测!思通数科 AI 卫士实时守护作业安全

塔吊施工中,人员操作合规性是安全管理的关键环节,但传统人工监管常面临 “监管范围有限、异常难实时发现” 的痛点:作业人员是否按规范穿戴防护装备(安全帽、防护服、防护手套),靠远处观察难判断穿戴完整性(如安…

Dos命令1

常用的dos命令 我不懂

题解:P1073 [NOIP 2009 提高组] 最优贸易

题目传送门 绝世好题 让我学会了分层图的真正用法 以前都只会自作聪明地分两层: 美其名曰【正图】【反图】 现在知道了还有这种神奇的建图方法!理解题意: 有向图 给定起点终点 求路径上两点买卖东西最大收益 思路:…

吩咐

吩咐rt。不知道要写些什么。 Q/A 或者别的。 记忆力可能比较差,可能会有内容错乱。Q以下是博客签名,正文无关 本文来自博客园,作者:Wy_x,转载请在文首注明原文链接:https://www.cnblogs.com/Wy-x/p/19151449 版权…

互评五

一、数据存储结构不同 ArrayImpl: 使用固定大小的数组 Student[] students ListImpl: 使用动态数组 ArrayList students 构造函数差异 ArrayImpl: 需要指定初始大小 public StudentDaoArrayImpl(int size) ListImpl: 无…

ACS ACR122 0 是啥

ACS ACR122 0 是啥你提到的 “ACS ACR122 0”,实际上指的是一个 NFC 读卡器(RFID Reader)。 下面我详细给你讲清楚它是什么、怎么用、以及它为什么会在系统里显示成那个名字。🪪 一、设备全称 ACS ACR122U NFC Re…

C++ std::forwardT 的使用

C++ std::forwardC++ std::forward 的使用 C++真实一门细节比较多的语言,稍不注意就会出现奇怪请琢磨不透的bug,这时候就说明你的C++基础不扎实。 C++ lvalue rvalue std::string hello = "Hello World";顾…

机器人技术新前沿:自动驾驶路径规划算法解析

本文深入探讨了自动驾驶机器人出租车技术的核心算法,包括基于机器学习的路径规划、环境感知与行为预测系统,并对比了火星探测器与城市自动驾驶在技术挑战上的差异。机器人技术新前沿 某中心子公司Zoox首席软件工程师…

前端框架文档新思路:基于源码解析的自动化方案

项目背景 最近我们团队自研了一个基于 React 的 H5 前端框架,领导让我来负责编写框架的使用文档。我选择了 dumi 来搭建文档站点,大部分内容都是手动写 Markdown 来介绍各种功能,包括:初始化、目录结构、生命周期、…

tryhackme-预安全-网络基础知识-数据包和帧-07

tryhackme-Pre Security-Pre Security-Network Fundamentals-Packets & Frames 房间地址:https://tryhackme.com/room/packetsframes 这是网络安全入门的基础模块的计算机科学基础知识:Packets & Frames(数…

Agilent E363x 系列

Agilent E363x 系列⚙️ 一、Agilent E363x 是什么设备 Agilent E363x(也写作 E3630 / E3631 / E3632 / E3633 / E3634 等型号) 是一系列由 Agilent Technologies(现 Keysight Technologies) 出品的 👉 可编程直流…

嗣澳——扫,墨依奥——描,希伊桉——线

rt: 扫描线 定义 扫描线顾名思义就是用线扫描,维护区间的长度。它一般被用来解决图形面积,周长问题。 rt:把整个矩形分成如图各个颜色不同的小矩形,小矩形的高是扫过的距离,然而矩形的水平宽一直在变化。 给每一个…

迈向零信任存储:基于RustFS构建内生安全的数据架构

迈向零信任存储:基于RustFS构建内生安全的数据架构在数据泄露事件频发的当下,传统边界安全模型已不足以保护企业核心数据资产。本文将深入解析如何基于RustFS构建​内生安全的零信任存储架构,实现从“信任网络”到“…

服务器被攻击!原因竟然是他?真没想到...

国庆回来之后服务器就被搞了,一直没用完过的流量,竟然神奇般就被耗费完了,这就要承担每天被扣费的问题了,而且正常用户访问也很慢。 于是赶紧用官方的安全工具扫描了服务器,没发现问题。之后看了 Nginx 的访问日志…

得到的眼泪学会了哭泣 得到的悲伤缓慢摧残肉体 被所爱之人踩在地

test23 前后缀排序sort 复制数组然后 sa 即可。 像忘了哪个题目一样,先考虑删除 \(s_i,s_k\) 哪个会更小,不妨令 \(i<j\)。考虑 \(s_j\) 是 \(i\) 后面第一个不同的字符,发现删除点在 \([i+1,j-1],j,[j+1,n]\) 的…

ChatGPT From Zero To Hero - LLM学习笔记(一) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于Java+SSM+Django数字工坊课程教学网站(源码+LW+调试文档+讲解等)/数字工坊/课程教学/网站链接/在线课程/学习资源/视频教程/教育平台/数字艺术/学习网站/课程资料/ - 详解

基于Java+SSM+Django数字工坊课程教学网站(源码+LW+调试文档+讲解等)/数字工坊/课程教学/网站链接/在线课程/学习资源/视频教程/教育平台/数字艺术/学习网站/课程资料/ - 详解2025-10-19 20:52 tlnshuju 阅读(0) 评…

框架架构的多维赋能——论其对自然语言处理深层语义分析的影响与启示

框架架构的多维赋能——论其对自然语言处理深层语义分析的影响与启示pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

路径规划算法学习Day1:深度优先搜索算法(DFS)

路径规划算法学习Day1:深度优先搜索算法(DFS)算法学习(Depth First Search) DFS是一种用于遍历或搜索树、图等结构的经典算法。其核心思想是沿一条路径尽可能深入,遇到无法继续的节点时再回溯到上一个分叉点,继…