news 2026/7/21 6:04:21

y1,y2总复习笔记5 2026.7.19

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
y1,y2总复习笔记5 2026.7.19

一,树状数组尾声

仅一个题目:树状数组求解最长上升子序列

思路:设置dp[i]维护以a[i]为结尾的最长上升子序列长度

条件:若有a[j] 满足(1)j<i (2)a[j]<a[i]则有dp[i]=dp[j]+1

若保证dp[i]最大即在满足(1)(2)条件下使dp[j]最大

求最大值的过程使用树状数组维护

有函数

ask(pos):查询值域 [1,pos]\内最大的 dp 值;

update(k,v):在值域 k 的位置,更新保存更大的 dp 值 v

这是整体思路,详细解析在注释

#include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,a[N],c[N],dp[N],ans; int lowbit(int n){ return n&-n; } void update(int k,int v){ for(int i=k;i<N;i+=lowbit(i)){ c[i]=max(c[i],v); } } int ask(int pos){ int ans=0; for(int i=pos;i;i-=lowbit(i)){ ans=max(ans,c[i]); } return ans; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); a[i]++; } //c[x] 维护值等于 x 的位置对应的最长上升子序列长度最大值 //更新条件(1)i<j(2)a[i]<a[j] for(int i=1;i<=n;i++){ dp[i]=ask(a[i]-1)+1; //查询值域[1,a[i]-1](前缀)所有对应的dp值的最大值 //后面a[i+1]到a[n]没update能保证位置i<j(1) //值域到a[i]-1保证a[j]值一定小于当前位置值a[i](2),+1即表示接上a[i] update(a[i],dp[i]); ans=max(ans,dp[i]);//所有位置最长上升子序列的最大值即为答案 } printf("%d\n",ans); }

二,拓扑排序

适用于有向无环图 DAG,若图有环则不存在拓扑序

图中任意一条有向边 u to v,顶点 u 在序列里一定出现在顶点 v 的前面, 则这个序列就称为图 G 的拓扑序列,求解该序列的过程叫做拓扑排序

求解过程就是先设置队列,后遍历全图的点,若该点入度为0入队,后一直遍历队列出队直到队列为空,遍历队列中点的临界点,若其入度为0入队

模板如下

void kahn(){ queue<int> q; // 入度为0的点入队 for(int i=1;i<=n;i++) if(in[i]==0) q.push(i); while(!q.empty()){ int u=q.front(); q.pop(); topo.push_back(u); for(int v:g[u]){ in[v]--; if(in[v]==0) q.push(v); } } } main函数 for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; g[u].push_back(v); in[v]++; } kahn();

例题解析:食物链

非常典型的模板

如图所示为某生态系统的食物网示意图,据图回答问题。

现在给你n个物种和m条能量流动关系,求其中的食物链条数。

物种的名称为从1到n编号

M条能量流动关系形如

a1 b1

a2 b2

a3 b3

......

am-1 bm-1

am bm

其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链

我们分析题目

食物网 = 有向无环图 DAG(自然界不会出现捕食环,不存在循环),可以用拓扑排序 + DP求解。

设 dp[u]:以 u 为终点的完整食物链数量

  • 若 u 是生产者(入度 = 0):它自己不能算食物链,但它是路径起点,dp[u] = 1(代表一条待延伸的起始链);
  • 若 u 不是生产者:()(所有有边的 v 的 dp 值相加)。

学过八下生物的都知道,在计算食物链条数的时候,若一点链接到该点,该点的食物链数量可以继承那一个点的食物链数量,若有多点则可全部继承进行累加

我们再看第一个点,生产者虽不算一条食物链,但任意一点链接生产者都可以构成一条食物链,根据上面的继承理论,有dp[生产者]=1

输出方面:只有出度 = 0的点才是食物链终点,遍历所有点 u: 如果 out[u] = 0,就把 dp[u] 累加到总答案里。 原因:只有走到没有下一捕食者的生物,才是一条完整食物链。

代码如下

#include<bits/stdc++.h> const int N=2e5+5; using namespace std; int n,m,in[N],out[N],dp[N],ans; vector<int> g[N]; void tuopu(){ queue<int> q; for(int i=1;i<=n;i++){ if(!in[i]&&out[i]) q.push(i),dp[i]=1; } //dp[i]以i为终点的食物链条数 while(!q.empty()){ int u=q.front(); q.pop(); for(int v:g[u]){ in[v]--; dp[v]+=dp[u]; if(!in[v]) q.push(v); } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; g[u].push_back(v); in[v]++;out[u]++; } tuopu(); for(int i=1;i<=n;i++){ if(!out[i]) ans+=dp[i]; } cout<<ans; }

三,并查集初步

树形结构,能够快速进行合并和查询的集合

作用:快速判断两点是否连通、合并连通块

模板如下:

初始化 for(int i=1;i<=n;i++){ fa[i]=i; } 找祖先 int Find(int x){ if(x==fa[x]) return x; return fa[x]=Find(fa[x]); } 合并 void merge(int x,int y){ x=Find(x),y=Find(y); if(x==y) return ; if(sz[x]>sz[y]) swap(x,y); fa[x]=y; sz[y]+=sz[x]; }

今天到这

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 6:03:16

微软Edge密码管理器升级:主密码与生物识别深度集成

1. Edge密码管理器升级背景解析 微软Edge浏览器内置的密码管理器即将迎来架构级重构&#xff0c;这可能是自Chromium内核切换以来最重要的安全功能革新。作为每天处理数百万用户凭证的核心组件&#xff0c;现有密码管理器存在三个明显痛点&#xff1a; 主密码缺失 &#xff1…

作者头像 李华
网站建设 2026/7/21 6:03:05

鸿蒙多功能工具箱开发实战(四)-路由导航与页面跳转

鸿蒙多功能工具箱开发实战(四)-路由导航与页面跳转 前言 路由导航是移动应用开发的核心功能之一。本文将详细讲解HarmonyOS中的路由机制&#xff0c;包括页面注册、路由跳转、参数传递、返回处理等核心功能。 一、HarmonyOS路由机制概述 1.1 路由配置文件 HarmonyOS使用 main_p…

作者头像 李华
网站建设 2026/7/21 6:02:45

数据工程师核心能力四问:延迟、变更、可信、架构

1. 为什么这4个问题比简历和证书更能筛出真数据工程师“数据工程师”这个头衔在招聘市场上已经快被用烂了。我见过简历写着“精通Airflow、Spark、Flink、Kubernetes”的候选人&#xff0c;现场白板画个端到端数据流图&#xff0c;连上游业务系统怎么触发ETL任务都说不清楚&…

作者头像 李华
网站建设 2026/7/21 5:59:42

Win10桌面便签工具的高效使用与团队协作指南

1. Win10桌面便签工具的核心价值解析在Windows 10环境下&#xff0c;桌面便签工具早已超越了简单的"电子便利贴"概念。我经手过上百个效率工具配置案例&#xff0c;发现90%的用户只发挥了这类工具20%的潜力。真正专业的桌面便签系统应该实现三大核心功能&#xff1a;…

作者头像 李华
网站建设 2026/7/21 5:58:50

商业简化策略:少即是多的实战解析

1. 项目概述&#xff1a;解码"少即是多"的商业哲学 "少即是多"这个看似矛盾的理念&#xff0c;在商业领域已经演变为一种高效的经营策略。最近与麦德龙前CEO蔡天乐的对话让我深刻体会到&#xff0c;这绝不仅仅是一句口号&#xff0c;而是经过实战验证的管理…

作者头像 李华
网站建设 2026/7/21 5:58:09

辛普森案庭审分析:证据规则与司法改革

1. 项目背景解析1995年1月30日&#xff0c;美国加州最高法院迎来了轰动全美的辛普森案第四日庭审。这起案件因其涉及名人、种族、司法公正等敏感议题&#xff0c;成为美国司法史上最具争议的刑事案件之一。作为法律从业者&#xff0c;我注意到这个案件至今仍被法学院作为经典案…

作者头像 李华