蓝桥杯备赛 Day16 单调数据结构
单调栈和单调队列能够动态的维护,还需用1-2两个数组在循环时从单调栈和单调队列中记录答案
单调栈
要点
1.时刻保持内部元素具有单调性质的栈(先进后出),核心是:入栈时逐个删除所有"更差的点",一般可分为单调递减栈、单调递增栈、单调不减栈、单调不增栈,例如要求某个点左侧第一个比它大的点的值(或位置),如下图所示:
![[单调栈.png]]
最后一个5入栈前要把前面那个5弹出,保证严格单调递减
2.单调栈用STL的stack实现,stack的操作:
C++ 中的 STL 也提供了一个容器 `std::stack`
- 元素访问- `st.top()` 返回栈顶
- 修改- `st.push()` 插入传入的参数到栈顶- `st.emplace()`- `st.pop()` 弹出栈顶
- 容量- `st.empty()` 返回是否为空- `st.size()` 返回元素数量
百亿富翁
学习:
(1)这题就是典型的单调栈的使用,就是对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出−1),利用单调栈来维护下标,两个数据记录答案即可
(2)可以开两个栈,也可以开一个栈中间清空即可
while(!st1.empty()){st1.pop();
}
(3)注意删除不满足的栈元素用while循环
代码:
#include <bits/stdc++.h>using namespace std;
const int N=7e5+10;
int n,a[N],l[N],r[N];
stack<int> st1,st2;int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];l[1]=-1;if(a[1]>a[2]) st1.emplace(1);for(int i=2;i<=n;i++){//不满足条件删除,注意用while while(!st1.empty() && a[i]>=a[st1.top()]){st1.pop();}//获取编号if(!st1.empty()) l[i]=st1.top();else l[i]=-1; //当前编号入栈st1.emplace(i); }//清空栈/*while(!st1.empty()){st1.pop();}*/ r[n]=-1;if(a[n]>a[n-1]) st2.emplace(n);for(int i=n-1;i>=1;i--){//不满足条件删除while(!st2.empty() && a[i]>=a[st2.top()]){st2.pop();}//获取编号if(!st2.empty()) r[i]=st2.top();else r[i]=-1; //当前编号入栈st2.emplace(i); }for(int i=1;i<=n;i++){cout<<l[i]<<" ";}cout<<"\n";for(int i=1;i<=n;i++){cout<<r[i]<<" ";}return 0;
}
最大区间
区间最值相关的问题
学习:
1.此题求求 L,R 使 (R−L+1)⋅min(AL,AL+1,…,AR)尽可能大,其中 min 表示最小值。转化为对于每一个元素Ai,求他作为最小值的区间(l[i],r[i])(即贡献),转化为求第 i
个元素左边第一个比它小的元素的下标和右边第一个比它小的元素的下标,最后区间长度-2即可,上面转换后的问题就是典型的单调栈问题
核心:将问题转化为对每个元素的独立分析,而不是直接枚举所有可能的区间(O(n^2)->O(n))
2.l数组和r数组的默认值:
vector<int> l(n+1,0);//l[i]记录第i个元素左边第一个比他小的元素序号,默认是0(因为答案是要序号+1的,表示能到第一个元素) vector<int> r(n+1,n+1);//r[i]记录第i个元素右边第一个比他小的元素序号,默认是n+1(因为答案是要序号-1的,表示能到最后一个元素)
3.保证栈是严格单调递增的,注意有=号
代码:
#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int N=3e5+10;
int n,a[N]; //l[i],l[i]记录第i个元素左边第一个比他小的元素序号,r[i]记录第i个元素右边第一个比他小的元素序号
stack<int> st;
ll res;int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];vector<int> l(n+1,0);//l[i]记录第i个元素左边第一个比他小的元素序号,默认是0(因为答案是要序号+1的,表示能到第一个元素) vector<int> r(n+1,n+1);//r[i]记录第i个元素右边第一个比他小的元素序号,默认是n+1(因为答案是要序号-1的,表示能到最后一个元素) //先算左边比自己小的元素序号 for(int i=1;i<=n;i++){//严格单调递增(有=号) while(!st.empty() && a[st.top()]>=a[i]) st.pop();if(!st.empty()) l[i]=st.top();st.emplace(i);}//清空栈while(!st.empty()) st.pop();//再算右边比自己小的元素序号 for(int i=n;i>=1;i--){//严格单调递增(有=号) while(!st.empty() && a[st.top()]>=a[i]) st.pop();if(!st.empty()) r[i]=st.top();st.emplace(i);} for(int i=1;i<=n;i++){//cout<<"i="<<i<<" l[i]="<<l[i]<<" r[i]="<<r[i]<<endl;//注意要-2 res=max(res,(ll)(r[i]-l[i]+1-2)*a[i]);}cout<<res;return 0;
}
四元组问题
学习:
(1)此题我根据条件:
四个不同的下标 a,b,c,d,使得 a < b < c < d ,并且 nums[d] < nums[c]< nums[a]< nums[b]
想到寻找每个元素左边和右边第一个比它小的元素的下标,此元素就是b,然后左边的就是a,右边的就是c,如果nums[c]>nums[a],那么就循环c=r[c],不断缩小nums[c],直到nums[c]<nums[a],或者不存在,最后判断nums[d]=nums[r[c]]存不存在即可,用单调栈解决
代码:
#include <bits/stdc++.h>using namespace std;
const int N=5e5+10;
int a[N],n;
stack<int> st;
bool res;
int l[N],r[N];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];//严格单调递增 for(int i=1;i<=n;i++){while(!st.empty() && a[st.top()]>=a[i]) st.pop();if(!st.empty()) l[i]=st.top();st.emplace(i);}while(!st.empty()) st.pop();for(int i=n;i>=1;i--){while(!st.empty() && a[st.top()]>=a[i]) st.pop();if(!st.empty()) r[i]=st.top();st.emplace(i);}//遍历寻找b元素for(int i=1;i<=n;i++){if(res) break;int ta=l[i],c=r[i];if(ta==0 || c==0) continue;//让a[c]<a[ta] while(a[ta]<=a[c]){c=r[c];if(c==0) break;}if(c==0) continue;//寻找dif(r[c]) res=true; } cout<<(res?"YES":"NO");return 0;
}
单调队列
要点
1.队内元素具有单调性质,一般将“下标”作为队列中的元素,而不是“元素值”
2.队头是“最优的元素”,后面是候选元素,每次入队时会将“没有价值的元素”直接删除
3.常用于处理固定长度的区间最值(常用于滑动窗口问题)
4.单调队列和优先队列的区别:
(1)单调队列一般用双端队列deque实现,需要在队头和队尾进行操作。而优先队列用STL的priority_queue实现(本质是堆)
(2)单调队列保持队列中元素的单调性,而优先队列不保证单调性,只保证队头元素是最大或最小。
(3)单调队列常用于滑动窗口问题,优先队列常用于需要动态获取最大或最小元素的场景。
5.双端队列操作:
C++ 中的 STL 也提供了一个容器 `std::deque`(双端队列)
- 元素访问- `dq.front()` 返回队头元素 - `dq.back()` 返回队尾元素- `dq.at(index)` 返回指定索引位置的元素(带边界检查)- `dq[index]` 返回指定索引位置的元素(无边界检查)
- 修改- `dq.push_front(value)` 在队头插入元素 - `dq.emplace_front(args...)` 在队头直接构造元素 - `dq.push_back(value)` 在队尾插入元素 - `dq.emplace_back(args...)` 在队尾直接构造元素 - `dq.pop_front()` 移除队头元素 - `dq.pop_back()` 移除队尾元素 - `dq.insert(iterator, value)` 在指定位置插入元素 - `dq.erase(iterator)` 移除指定位置的元素- `dq.clear()` 清空所有元素
- 容量- `dq.empty()` 返回是否为空 - `dq.size()` 返回元素数量 - `dq.max_size()` 返回可容纳的最大元素数量
买蛋糕
学习:
(1)典型的用单独队列来求固定长度为k的区间的最值(最大值和最小值都可以),用双端队列deque实现,比如要求长度为k的最小值,让双端队列单掉递增,队首front是最小值序号,要判断队首元素是否在(i-k+1,i)中,不再则弹出。判断要插入元素和队尾元素的大小,如果小于队尾元素,则弹出队尾元素。最终把队首元素放入mi数组中
(2)此题涉及(a / b) % mod,且mod= 998244353998244353是质数,可以用费马小定理+快速幂求逆元,得 ( a / b ) % m o d = a ∗ b ( m o d − 2 ) % m o d (a/b)\%mod=a*b^{(mod-2)}\%mod (a/b)%mod=a∗b(mod−2)%mod
[[Day17 数学]]
(3)最好有取模的都用long long,可以使用以下技巧快速修改:
#define int long longsigned main(){ //不能写int}
代码:
#include <bits/stdc++.h>#define int long longusing namespace std;
const int N=1e5+10,M=998244353;
int n,k,x,a[N],sum,cnt;
deque<int> dq1,dq2;//dq1单调递增,队头是最小值序号,dq2单调递减,队头是最大值序号
int mx[N],mi[N]; //到k为止位置的最小值和最大值 int binpow(int base,int power){int res=1;while(power){if(power & 1){res=(res*base)%M;}base=(base*base)%M;power>>=1; //有个= }return res;
}signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>k>>x;for(int i=1;i<=n;i++) cin>>a[i];//求长度为k的区间的最小值for(int i=1;i<=n;i++){//队头序号不在(i-k+1,i)之间则弹出,维护长度为kwhile(!dq1.empty() && dq1.front()<i-k+1) dq1.pop_front();//插入元素比队尾元素小弹出队尾元素while(!dq1.empty() && a[i]<a[dq1.back()]) dq1.pop_back();//插入元素序号到队尾dq1.emplace_back(i);//获取到i位置为止的最小值mi[i]=a[dq1.front()]; } //求长度为k的区间的最大值for(int i=1;i<=n;i++){//队头序号不在(i-k+1,i)之间则弹出,维护长度为kwhile(!dq2.empty() && dq2.front()<i-k+1) dq2.pop_front();//插入元素比队尾元素大弹出队尾元素while(!dq2.empty() && a[i]>a[dq2.back()]) dq2.pop_back();//插入元素序号到队尾dq2.emplace_back(i);//获取到i位置为止的最大值mx[i]=a[dq2.front()]; }//获取结果for(int i=k;i<=n;i++){if((mx[i]-mi[i])<=x) cnt++;} cout<<cnt*binpow(n-k+1,M-2)%M<<endl;return 0;
}
子矩阵
学习:
(1)此题就是一维求长度为k的区间的最值的二维拓展,求区间长a,宽b的最大值和最小值,用双端队列实现单调队列,内部元素就是位置(i,j)的有序对即可
代码:
#include <bits/stdc++.h>using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N=1005,mod=998244353;
ll a[N][N],res;
deque<PII> dqmin,dqmax;//队首是最小值、最大值,对内元素为(i,j)
int n,m,ta,b;
ll resmin[N][N],resmax[N][N];int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>m>>ta>>b;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}//算最小值 for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){//不在(i-ta+1,i)(j-b+1,j)内出队列while(!dqmin.empty() && (dqmin.front().first<(i-ta+1) || dqmin.front().second<(j-b+1))) dqmin.pop_front();//插入元素小于队尾元素,弹出队尾元素while(!dqmin.empty() && a[i][j]<a[dqmin.back().first][dqmin.back().second]) dqmin.pop_back();//插入元素到队尾dqmin.emplace_back(i,j); resmin[i][j]=a[dqmin.front().first][dqmin.front().second]; }}//算最大值 for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){//不在(i-ta+1,i)(j-b+1,j)内出队列while(!dqmax.empty() && (dqmax.front().first<(i-ta+1) || dqmax.front().second<(j-b+1))) dqmax.pop_front();//插入元素大于队尾元素,弹出队尾元素while(!dqmax.empty() && a[i][j]>a[dqmax.back().first][dqmax.back().second]) dqmax.pop_back();//插入元素到队尾dqmax.emplace_back(i,j); resmax[i][j]=a[dqmax.front().first][dqmax.front().second]; }}//算结果for(int i=ta;i<=n;i++){for(int j=b;j<=m;j++){ll t=(resmin[i][j]*resmax[i][j])%mod;res=(res+t)%mod;}} cout<<res;return 0;
}
游戏
学习:
(1)典型的用单调队列求区间最值问题
(2)学会输出浮点数(保留2位小数)
cout<<fixed<<setprecision(2)<<res;
(3)最后结果利用数学公式总结最大值和最小值的和都出现了(n-k+1)次,不用O(n^n)遍历算,O(n)就能解决,且还能约掉一个(n-k+1),如果不约,不能直接除以(n-k+1)*(n-k+1),会越界
代码:
#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,k,a[N];
deque<int> dqmin,dqmax;
int minn[N],maxn[N];
ll sum,cnt,summin,summax;
double res;int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){while(!dqmin.empty() && dqmin.front()<i-k+1) dqmin.pop_front();while(!dqmin.empty() && a[dqmin.back()]>a[i]) dqmin.pop_back();dqmin.emplace_back(i);if(i>=k) summin+=a[dqmin.front()]; }for(int i=1;i<=n;i++){while(!dqmax.empty() && dqmax.front()<i-k+1) dqmax.pop_front();while(!dqmax.empty() && a[dqmax.back()]<a[i]) dqmax.pop_back();dqmax.emplace_back(i);if(i>=k) summax+=a[dqmax.front()];}sum=(n-k+1)*(n-k+1);/*for(int i=k;i<=n;i++){for(int j=k;j<=n;j++){cnt+=(maxn[i]-minn[j]);}}*/cout<<fixed<<setprecision(2)<<(summax-summin)*1.0/(n-k+1);return 0;
}
优先队列
要点:
1.动态维护和快速访问优先级最高(或最低)元素(只能访问队首元素,不能像双端队列既能访问队首元素,也能访问队尾元素)的问题
2.优先队列操作:
C++ 中的 STL 提供了一个容器 `std::priority_queue`(优先队列),它是一种特殊的队列,元素按照优先级排序,默认情况下最大元素位于队首。
- 元素访问- `pq.top()` 返回队首元素(优先级最高的元素),注意这里没有 `front()` 方法,因为优先队列的逻辑是总是访问优先级最高的元素。
- 修改- `pq.push(value)` 在队列中插入元素,插入后队列会自动调整元素顺序以保证队首元素优先级最高。- `pq.emplace(args...)` 在队列中直接构造元素,同样插入后会自动调整顺序。- `pq.pop()` 移除队首元素(优先级最高的元素)。
- 容量- `pq.empty()` 返回队列是否为空。- `pq.size()` 返回队列中元素的数量。- `pq.max_size()` 返回队列可容纳的最大元素数量。
合并果子
学习:
不断找最小的两个元素,使用优先队列获得,加起来得到t,结果加上t,再把t放到优先队列中
代码:
#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int N=1e4+10;
int n,a;
ll res;
priority_queue<ll,vector<ll>,greater<ll>> pq;//队首是最小值 int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>a;pq.emplace(a);}if(pq.size()==1){res=pq.top();}while(pq.size()>1){int t1=pq.top();//cout<<"t1="<<t1<<endl;pq.pop();int t2=pq.top();//cout<<"t2="<<t2<<endl;pq.pop();res+=(ll)t1+t2;//cout<<"res="<<res<<endl;pq.emplace(t1+t2);}cout<<res;return 0;
}
最大开支
思想值得学习
学习:
1.此题要用优先队列动态维护每个项目的边际成本(即每增加一个人时,总成本的变化),通过计算对第i个项目从x-1个人增加到x个人所需钱的差,然后放到优先队列中,答案累加边际成本即可(含义是增加一个人的成本增加的最大值(不用管哪个项目)),最多n个人
代码:
#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int M=1e5+10;
int n,m,k[M],b[M],cnt[M];
ll res;
priority_queue<ll> pq;//返回第i个项目增加1个人所增加的钱数(即从x-1增加到x人)
//x(kx+b)-(x-1)(k(x-1)+b)=k(2x-1)+b
ll getCost(int i,int x){//ll res=max((ll)x*(k[i]*x+b[i])-(ll)(x-1)*(k[i]*(x-1)+b[i]),(ll)0);ll res=max((ll)k[i]*(2*x-1)+b[i],(ll)0);return res;
} int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=m;i++){cin>>k[i]>>b[i];}//算对于第i个项目增加1个人所需增强的钱数放到优先队列中 for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){//如果第i个项目j个人相对于j-1个人是增加钱的,放到优先队列中if(getCost(i,j)){pq.emplace(getCost(i,j)); }else break;}}//计算num次(最多n个人,即最多增加n次>0的钱,但也有可能pq大小小于n,0不在里面)int num=min((int)pq.size(),n);while(num--){res+=pq.top();pq.pop();} cout<<res;//下面这种比较好理解int num=n;while(!pq.empty() && num>0){res+=pq.top();pq.pop();num--;}return 0;
}
相关文章:
蓝桥杯备赛 Day16 单调数据结构
单调栈和单调队列能够动态的维护,还需用1-2两个数组在循环时从单调栈和单调队列中记录答案 单调栈 要点 1.时刻保持内部元素具有单调性质的栈(先进后出),核心是:入栈时逐个删除所有"更差的点",一般可分为单调递减栈、单调递增栈、单调不减栈、单调不增…...
AI Agent开发大全第十九课-神经网络入门 (Tensorflow)
(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 一、从买房困惑到神经元:神经网络的灵感来源 1.1 房地产经纪人的定价难题 想象一个周末的房产中介门店,经纪人小李正面对10份不同房源的报...
Mac VM 卸载 win10 安装win7系统
卸载 找到相应直接删除(移动到废纸篓) 可参考:mac如何卸载虚拟机win 下载 win7下载地址...
torch.nn中的非线性激活使用
1、神经网络中的非线性激活 在神经网络中,**非线性激活函数(Non-linear Activation Functions)**是引入非线性变换的关键组件,使神经网络能够学习并建模复杂的非线性关系。如果没有激活函数,无论神经网络有多少层&…...
【安全】Web渗透测试(全流程)_渗透测试学习流程图
1 信息收集 1.1 域名、IP、端口 域名信息查询:信息可用于后续渗透 IP信息查询:确认域名对应IP,确认IP是否真实,确认通信是否正常 端口信息查询:NMap扫描,确认开放端口 发现:一共开放两个端口&…...
要素的选择与转出
1.要素选择的三种方式 当要在已有的数据中选择部分要素时,ArcMap提供了三种方式:按属性选择、位置选择及按图形选择。 1)按属性选择 通过设置 SQL查询表达式,用来选择与选择条件匹配的要素。 (1)单击主菜单下【选择】【按属性选择】,打开【按…...
C 语言命令行参数:让程序交互更灵活
一、引言 在 C 语言编程领域,命令行参数是一种极为实用的机制,它允许我们在执行程序时,从外部向程序传递数据。这一特性极大地增强了程序的灵活性和可控性,避免了在代码中对数据进行硬编码。比如在开发系统工具、脚本程序时&…...
部署nerdctl工具
nerdctl 是一个专为Containerd设计的容器管理命令行工具,旨在提供类似 Docker 的用户体验,同时支持 Containerd 的高级特性(如命名空间、compose等)。 1、下载安装 wget https://github.com/containerd/nerdctl/releases/downlo…...
SOA 架构
定义与概念:SOA 将应用程序的不同功能单元(称为服务)进行封装,并通过定义良好的接口和协议来实现这些服务之间的通信和交互。这些服务可以在不同的平台和编程语言中实现,彼此之间相互独立,能够以松散耦合的…...
K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority
前言 在Kubernetes环境中使用自签名证书的私有Harbor镜像仓库时,常会遇到证书验证失败的问题。本文将详细讲解如何解决这个常见的证书问题。 环境信息: Kubernetes版本:1.28.2容器运行时:containerd 1.6.20私有仓库:…...
在线考试系统带万字文档java项目java课程设计java毕业设计springboot项目
文章目录 在线考试系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档(9.9¥带走) 在线考试系统 一、项目演示 在线考试系统 二、项目介绍 1、管理员角色: 考试管理&…...
Axure RP 9 详细图文安装流程(附安装包)教程包含下载、安装、汉化、授权
文章目录 前言一、Axure RP 9介绍二、Axure RP 9 安装流程1. Axure RP 9 下载2. 启动安装程序3. 安装向导操作4.完成安装 三、Axure RP 9 汉化四、Axure RP 9授权 前言 本基础安装流程教程,将以清晰、详尽且易于遵循的步骤介绍Axure RP 9 详细图文安装流程…...
动态规划练习题④
583. 两个字符串的删除操作 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1: 输入: word1 "sea", word2 "eat" 输出: 2 解释: 第一步将 &quo…...
多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测
多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…...
爬虫工程师的社会现状
现在网上你只要搜索教程就是韦世东;k哥爬虫教你爬虫方面的逆向知识;然后看着这些逆向js百例;搞得我很尴尬我做了这么多年的爬虫工程师;现在算什么;这些逆向的东西我并没有很深层次的了解;但是工作的内容也依旧解决了;并没有到爬虫工程师非要会那么多逆向才能算的上是合格的爬虫…...
Flink 1.20 Kafka Connector:新旧 API 深度解析与迁移指南
Flink Kafka Connector 新旧 API 深度解析与迁移指南 一、Flink Kafka Connector 演进背景 Apache Flink 作为实时计算领域的标杆框架,其 Kafka 连接器的迭代始终围绕性能优化、语义增强和API 统一展开。Flink 1.20 版本将彻底弃用基于 FlinkKafkaConsumer/FlinkK…...
Vue2 父子组件数据传递与调用:从 ref 到 $emit
提示:https://github.com/jeecgboot/jeecgboot-vue2 文章目录 案例父组件向子组件传递数据的方式父组件调用子组件方法的方式子组件向父组件传递数据的方式流程示意图 案例 提示:以下是本篇文章正文内容,下面案例可供参考 以下是 整合后的关…...
【matplotlib参数调整】
1. 基本绘图函数常用参数 折线图 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 10, 100) y np.sin(x)plt.plot(x, y, colorred, linestyle--, linewidth2,markero, markersize5, labelsin(x), alpha0.8) plt.title(折线图示例) plt.xlabel(X 轴) p…...
如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)
以下是详细步骤: 1. 创建项目 1.1 打开 IntelliJ IDEA。 1.2 在启动界面,点击 Create New Project(创建新项目)。 1.3 选择 Java,然后点击 Next。 1.4 确保 Project SDK 选择了正确的 JDK 版本&#x…...
Linux红帽:RHCSA认证知识讲解(十 一)配置NTP 时间同步、用户密码策略与使用 autofs 实现 NFS 自动挂载
Linux红帽:RHCSA认证知识讲解(十 一)配置NTP 时间同步、用户密码策略与 NFS 自动挂载 前言一、配置 NTP 时间同步1.1 NTP 简介1.2 安装和配置 NTP 客户端 二、配置新建用户密码过期时间2.1 查看用户密码过期时间2.2 修改密码过期时间 三、使用…...
ffmpeg音视频处理流程
文章目录 FFmpeg 音视频处理流程详细讲解总结音视频处理流程相关的 FFmpeg 工具和命令 FFmpeg 的音视频处理流程涵盖了从输入文件读取数据、编码和解码操作、数据处理、以及最终输出数据的完整过程。为了更好地理解这一流程,我们可以从以下几个关键步骤来分析&#…...
leetcode-代码随想录-链表-移除链表元素
题目 链接:203. 移除链表元素 - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 输入:head [1,2,6,3,4,5,6], val 6 …...
c++与rust的语言区别,rust的主要难点,并举一些例子
C 和 Rust 都是系统级编程语言,它们在设计目标、语法、内存管理等方面存在诸多区别,以下为你详细介绍: 设计目标 C:C 最初是为了给 C 语言添加面向对象编程特性而设计的,之后不断发展,旨在提供高性能、灵…...
从基础算力协作到超智融合,超算互联网助力大语言模型研习
一、背景 大语言模型(LLMs)的快速发展释放出了AI应用领域的巨大潜力。同时,大语言模型作为 AI领域的新兴且关键的技术进展,为 AI 带来了全新的发展方向和应用场景,给 AI 注入了新潜力,这体现在大语言模型独…...
【spring cloud Netflix】Eureka注册中心
1.概念 Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的 需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。同时,服务提供方与Eureka之间通过“心跳” 机制进行监控…...
记录学习的第二十天
今天只做了一道题,有点不在状态。 这道题其实跟昨天的每日一题是差不多的,不过这道题需要进行优化。 根据i小于j,且j小于k,当nums[j]确定时,保证另外两个最大即可得答案。 所以可以使用前缀最大值和后缀最大值。 代…...
7-5 表格输出
作者 乔林 单位 清华大学 本题要求编写程序,按照规定格式输出表格。 输入格式: 本题目没有输入。 输出格式: 要求严格按照给出的格式输出下列表格: ------------------------------------ Province Area(km2) Pop.(…...
【爬虫开发】爬虫开发从0到1全知识教程第14篇:scrapy爬虫框架,介绍【附代码文档】
本教程的知识点为:爬虫概要 爬虫基础 爬虫概述 知识点: 1. 爬虫的概念 requests模块 requests模块 知识点: 1. requests模块介绍 1.1 requests模块的作用: 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点:…...
安装 Microsoft Visual C++ Build Tools
Microsoft Visual C Build Tools下载安装 安装Microsoft Visual C Build Tools是为了在windows系统上编译和运行需要C支持的程序或库(例如某些Python包,Node.js模块等)。 1.下载 打开浏览器,访问 Visual Studio Build Tools下载…...
启服云专利管理系统:铸就知识产权保护的坚固壁垒
在全球竞争日益激烈的今天,知识产权已经成为企业核心竞争力的关键组成部分,而专利作为知识产权的重要体现,其管理和保护显得尤为重要。启服云专利管理系统凭借其卓越的功能和先进的技术,在知识产权保护领域展现出了显著的优势。 高…...
树莓派 5 部署 OMV(OpenMediaVault)
我使用Raspberry Pi OS Lite【Debian version: 12 (bookworm)】搭建OMV 换源,换源教程请参考:树莓派 5 换源 加入omv国内清华源 # 创建openmediavault.list文件 touch /etc/apt/sources.list.d/openmediavault.list # 加入内容 echo "deb [signed…...
Opencv之dilib库:表情识别
一、简介 在计算机视觉领域,表情识别是一个既有趣又具有挑战性的任务。它在人机交互、情感分析、安防监控等众多领域都有着广泛的应用前景。本文将详细介绍如何使用 Python 中的 OpenCV 库和 Dlib 库来实现一个简单的实时表情识别系统。 二、实现原理 表情识别系统…...
吾爱置顶软件,吊打电脑自带功能!
今天我给大家带来一款超棒的软件,它来自吾爱论坛的精选推荐,每一款都经过精心挑选,绝对好用! S_Clock 桌面计时软件 这款软件的界面设计特别漂亮,简洁又大方。它是一款功能齐全的时钟计时倒计时软件,既能正…...
深入理解浏览器的事件循环
浏览器的进程模型 浏览器进程:负责子进程的管理和用户交互网络进程:负责加载网络资源渲染进程:浏览器会为每一个标签页开启一个新的渲染进程。 渲染进程中的渲染主线程是我们最关注的,因为浏览器的事件循环就发生在这之中渲染主进…...
分布式锁之redis6
一、分布式锁介绍 之前我们都是使用本地锁(synchronize、lock等)来避免共享资源并发操作导致数据问题,这种是锁在当前进程内。 那么在集群部署下,对于多个节点,我们要使用分布式锁来避免共享资源并发操作导致数据问题…...
数据框的添加
在地图制图中,地图全图显示的同时希望也能够显示局部放大图,以方便查看地物空间位置的同时,也能查看地物具体的相对位置。例如,在一个名为airport的数据集全图制图过程中,希望能附上机场区域范围的局部地图,…...
SQL Server 2022 读写分离问题整合
跟着热点整理一下遇到过的SQL Server的问题,这篇来聊聊读写分离遇到的和听说过的问题。 一、读写分离实现方法 1. 原生高可用方案 1.1 Always On 可用性组(推荐方案) 配置步骤: -- 1. 启用Always On功能 USE [master] GO ALT…...
启服云云端专利管理系统:解锁专利管理新境界
在当今竞争激烈的商业环境中,专利作为企业的核心资产,其管理的重要性不言而喻。启服云云端专利管理系统以其卓越的性能和独特的优势,成为企业专利管理的得力助手,为企业的创新发展保驾护航。 便捷高效,突破时空限制 启…...
记录一下零零散散的的东西-ImageNet
ImageNet 是一个非常著名的大型图像识别数据集, 数据集基本信息 内容说明📸 图像数量超过 1400万张图片(包含各类子集)🏷️ 类别数量常用的是 ImageNet-1K(1000类)🧑Ἶ…...
全连接RNN反向传播梯度计算
全连接RNN反向传播梯度计算 RNN数学表达式BPTT(随时间的反向传播算法)参数关系网络图L对V的梯度L对U的梯度L对W和b的梯度 RNN数学表达式 BPTT(随时间的反向传播算法) 参数关系网络图 L对V的梯度 L对U的梯度 L对W和b的梯度...
基于BusyBox构建ISO镜像
1. 准备 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建议:系统内核<3.10.0 使用busybox < 1.33.2版本 2. 安装busybox # 安装依赖 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下载 wget https://…...
使用python完成手写数字识别
入门图像识别的第一个案例,看到好多小伙伴分享,也把自己当初的思路捋捋,写成一篇博客,作为记录和分享,也欢迎各位交流讨论。 实现思路 数据集:MNIST(包含60,000个训练样本和10,000个测试样本) 深度学习框架:Keras(基于TensorFlow) 模型架构:卷积神经网络(CNN) 实…...
Vue2 过滤器 Filters
提示:Vue 过滤器是用于格式化文本的 JavaScript 函数,通过管道符 | 在模板中使用 文章目录 前言过滤器的核心特性1. 链式调用2. 参数传递3. 纯函数特性 过滤器的常见使用场景1. 文本格式化2. 数字处理3. 日期/时间格式化4. 样式控制(结合组件…...
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
c++中cin.ignore()的作用
在 C 中,cin.ignore() 是用于忽略(丢弃)输入流中的字符的函数,通常用来清除输入缓冲区中的残留内容(如换行符、多余输入等),以避免影响后续的输入操作。 基本用法 cin.ignore(n, delim);n&…...
讲一下resblock的跳跃连接,以及连接前后的shape保持(通过padding保持shape不变)
ResNet 残差块(ResBlock)的跳跃连接 & 形状保持 ResNet(Residual Network)通过 残差块(Residual Block, ResBlock) 解决了深度网络的梯度消失问题。其核心是跳跃连接(Skip Connection&…...
Unity中优化绘制调用整理
DrawCall 指的是 CPU 向 GPU 发送渲染指令的过程,在 Unity 中,每次渲染一个网格时,CPU 都需要向 GPU 发送一系列的渲染指令,这个过程被称为一次绘制调用(Draw Call)。 1.GPU实例化 使用: 2.绘…...
Coco-AI 支持嵌入,让你的网站拥有 AI 搜索力
在之前的实践中,我们已经成功地把 Hexo、Hugo 等静态博客和 Coco-AI 检索系统打通了:只要完成向量化索引,就可以通过客户端问答界面实现基于内容的智能检索。 这一层已经很好用了,但总觉得少了点什么—— 比如用户还得专门打开一…...
深入解析Java哈希表:从理论到实践
哈希表(Hash Table)是计算机科学中最重要的数据结构之一,也是Java集合框架的核心组件。本文将以HashMap为切入点,深入剖析Java哈希表的实现原理、使用技巧和底层机制。 一、哈希表基础原理 1. 核心概念 键值对存储:通…...
leetcode76.最小覆盖子串
思路源于 【小白都能听懂的算法课】【力扣】【LeetCode 76】最小覆盖子串|滑动窗口|字符串 初始化先创建t的哈希表记录t中的字符以及它出现的次数,t的have记录t中有几种字符 s的哈希表记录窗口中涵盖t的字符以及它出现的次数,初始…...