1.31学习总结

1.31
1.线段树
2.Bad Hair Day S(单调栈)
3.01迷宫(BFS连通块问题+剪枝)(连通性问题的并查集解法)
4.健康的荷斯坦奶牛 Healthy Holsteins(DFS)

线段树与树状数组

线段树和树状数组的功能相似,但是线段树的功能要更加强大一些,但是线段树的构造比树状数组更加复杂。

在动态区间和的问题上,朴素暴力的算法复杂度达到了O(n^2)效率很低,在前缀和中,计算出所有的前缀和的复杂度是O(n),而查询只要O(1),所以总复杂度只有O(n),但如果面对的是动态的区间和问题,计算量就会大大增加,如果涉及到区间修改,就会更加棘手,因为修改其中的一个值,会导致后面的前缀和发生改变,所以就需要O(n)的复杂度,那么如果改变m次元素的值,复杂度就达到了O(mn),和暴力的方法是一样的,所以就需要用到树状数组或者是线段树这样的结构,由于这样的结构存储是非线性的,所以在修改元素上的时间是O(logn),同理查询某个元素的复杂度也是O(logn),由于初始化数组的时候,需要逐个读取数值所以初始化的复杂度是O(nlogn)所以总复杂度是O(nlogn),线段树的复杂度和树状数组是相当的,线段树和树状数组的区别就在于树状数组在面对区间查询,区间修改问题时非常棘手,而线段树可以很轻松的解决区间问题

树状数组主要就只有三个函数,lowbit(),更新函数:update(),求和函数:sum()

#define lowbit(x) (x& (-x))
void update(int x,int k)
{while(x<=n){tree[x]+=k;x+=lowbit(x);//子节点+k,父节点都要+k }
}
int sum(int x)
{int res=0;while (x>0){res+=tree[x];x-=lowbit(x);//求的是1---x的区间和 }return res;
}

这三个函数构成了树状数组的主要部分

初始化数组

for (int i=1;i<=n;++i){cin>>a[i];update(i,a[i]);}

全部代码(单点修改+区间查询)https://www.luogu.com.cn/problem/P3374

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N=5e5+5;
#define lowbit(x) (x& (-x))
int tree[N],a[N];
int n;
void update(int x,int k)
{while(x<=n){tree[x]+=k;x+=lowbit(x);//子节点+k,父节点都要+k }
}
int sum(int x)
{int res=0;while (x>0){res+=tree[x];x-=lowbit(x);//求的是1---x的区间和 }return res;
}
signed main()
{int q;cin>>n>>q;for (int i=1;i<=n;++i){cin>>a[i];update(i,a[i]);}for (int i=0;i<q;++i){int a,b,c;cin>>a>>b>>c;if (a==1){update(b,c);}else if (a==2){int ans=0;ans=sum(c)-sum(b-1);cout<<ans<<endl;}}
}

(区间修改+单点查询)需要用到差分数组的性质https://www.luogu.com.cn/problem/P3368

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N=5e5+5;
#define lowbit(x) (x& (-x))
int tree[N],a[N],d[N];
int n,q;
void update(int x,int k)
{while (x<=n){tree[x]+=k;x+=lowbit(x);}
}
int sum(int x)
{int res=0;while (x>0){res+=tree[x];x-=lowbit(x);}return res;
}
signed main()
{cin>>n>>q;for (int i=1;i<=n;++i){cin>>a[i];d[i]=a[i]-a[i-1];update(i,d[i]);//放的是差分数组的值,这样树状数组保存的就是差分数组的前缀和 }for (int i=0;i<q;++i){int op;cin>>op;if (op==1){int a,b,c;cin>>a>>b>>c;update(a,c);update(b+1,-c);}if (op==2){int a;cin>>a;int res=sum(a);cout<<res<<endl;}}}

运用线段树会麻烦很多

它需要向上更新函数push_up,向下更新函数push_down,建树函数build,更新函数update和查询函数query

同时树上的节点都是以结构体的形式出现,这样方便找到当前节点的区间

struct node{int sum;int l;int r;int add;
}tree[4*N];
int a[N];
inline void push_up(int p){tree[p].sum=tree[lc].sum+tree[rc].sum;
}
inline void push_down(int p){if (tree[p].add){tree[lc].sum+=tree[p].add*(tree[lc].r-tree[lc].l+1);tree[lc].add+=tree[p].add;tree[rc].sum+=tree[p].add*(tree[rc].r-tree[rc].l+1);tree[rc].add+=tree[p].add;tree[p].add=0;}return ;
}
inline void build(int p,int l,int r){tree[p]={a[l],l,r,0};if (l==r) return ;int mid=tree[p].l+tree[p].r>>1;build(lc,l,mid);build(rc,mid+1,r);push_up(p);
}
inline void update(int p,int l,int r,int k){if (tree[p].l>=l && tree[p].r<=r){tree[p].sum+=k*(tree[p].r-tree[p].l+1);tree[p].add+=k;return ;}push_down(p);int mid=tree[p].r+tree[p].l>>1;if (mid>=l) update(lc,l,r,k);if (mid<r)	update(rc,l,r,k);push_up(p);
}
inline int query(int p,int l,int r){if (tree[p].l>=l && tree[p].r<=r){return tree[p].sum;}push_down(p);int mid=tree[p].l+tree[p].r>>1;int s=0;if (mid>=l)	s+=query(lc,l,r);if (mid<r)	s+=query(rc,l,r);return s; 
}

但是打好框架之后解决问题就很简单。只需要改改数值就好了

单点修改+区间查询:https://www.luogu.com.cn/problem/P3374

#include <bits/stdc++.h>
using namespace std;#define int long long
#define lc p<<1
#define rc p<<1|1const int N=1e6+10;
struct node{int sum;int l;int r;int add;
}tree[4*N];
int a[N];
inline void push_up(int p){tree[p].sum=tree[lc].sum+tree[rc].sum;
}
inline void push_down(int p){if (tree[p].add){tree[lc].sum+=tree[p].add*(tree[lc].r-tree[lc].l+1);tree[lc].add+=tree[p].add;tree[rc].sum+=tree[p].add*(tree[rc].r-tree[rc].l+1);tree[rc].add+=tree[p].add;tree[p].add=0;}return ;
}
inline void build(int p,int l,int r){tree[p]={a[l],l,r,0};if (l==r) return ;int mid=tree[p].l+tree[p].r>>1;build(lc,l,mid);build(rc,mid+1,r);push_up(p);
}
inline void update(int p,int l,int r,int k){if (tree[p].l>=l && tree[p].r<=r){tree[p].sum+=k*(tree[p].r-tree[p].l+1);tree[p].add+=k;return ;}push_down(p);int mid=tree[p].r+tree[p].l>>1;if (mid>=l) update(lc,l,r,k);if (mid<r)	update(rc,l,r,k);push_up(p);
}
inline int query(int p,int l,int r){if (tree[p].l>=l && tree[p].r<=r){return tree[p].sum;}push_down(p);int mid=tree[p].l+tree[p].r>>1;int s=0;if (mid>=l)	s+=query(lc,l,r);if (mid<r)	s+=query(rc,l,r);return s; 
}
signed main(){int n,m;cin>>n>>m;for (int i=1;i<=n;++i)	cin>>a[i];build(1,1,n);for (int i=0;i<m;++i){int op;cin>>op;if (op==1){int a,b;cin>>a>>b;update(1,a,a,b);}else if (op==2){int a,b;cin>>a>>b;int sum1=query(1,a,b);cout<<sum1<<endl;}}
}

区间修改+单点查询:https://www.luogu.com.cn/problem/P3368

#include <bits/stdc++.h>
using namespace std;#define int long long
#define lc p<<1
#define rc p<<1|1const int N=1e6+10;
struct node{int sum;int l;int r;int add;
}tree[4*N];
int a[N];
inline void push_up(int p){tree[p].sum=tree[lc].sum+tree[rc].sum;
}
inline void push_down(int p){if (tree[p].add){tree[lc].sum+=tree[p].add*(tree[lc].r-tree[lc].l+1);tree[lc].add+=tree[p].add;tree[rc].sum+=tree[p].add*(tree[rc].r-tree[rc].l+1);tree[rc].add+=tree[p].add;tree[p].add=0;}return ;
}
inline void build(int p,int l,int r){tree[p]={a[l],l,r,0};if (l==r) return ;int mid=tree[p].l+tree[p].r>>1;build(lc,l,mid);build(rc,mid+1,r);push_up(p);
}
inline void update(int p,int l,int r,int k){if (tree[p].l>=l && tree[p].r<=r){tree[p].sum+=k*(tree[p].r-tree[p].l+1);tree[p].add+=k;return ;}push_down(p);int mid=tree[p].r+tree[p].l>>1;if (mid>=l) update(lc,l,r,k);if (mid<r)	update(rc,l,r,k);push_up(p);
}
inline int query(int p,int l,int r){if (tree[p].l>=l && tree[p].r<=r){return tree[p].sum;}push_down(p);int mid=tree[p].l+tree[p].r>>1;int s=0;if (mid>=l)	s+=query(lc,l,r);if (mid<r)	s+=query(rc,l,r);return s; 
}
signed main(){int n,m;cin>>n>>m;for (int i=1;i<=n;++i)	cin>>a[i];build(1,1,n);for (int i=0;i<m;++i){int op;cin>>op;if (op==1){int a,b,c;cin>>a>>b>>c;update(1,a,b,c);}else if (op==2){int a;cin>>a;int sum1=query(1,a,a);cout<<sum1<<endl;}}
}

区间修改,区间查询https://www.luogu.com.cn/problem/P3372

#include <bits/stdc++.h>
using namespace std;#define int long long
#define lc p<<1
#define rc p<<1|1const int N=1e6+10;
struct node{int sum;int l;int r;int add;
}tree[4*N];
int a[N];
inline void push_up(int p){tree[p].sum=tree[lc].sum+tree[rc].sum;
}
inline void push_down(int p){if (tree[p].add){tree[lc].sum+=tree[p].add*(tree[lc].r-tree[lc].l+1);tree[lc].add+=tree[p].add;tree[rc].sum+=tree[p].add*(tree[rc].r-tree[rc].l+1);tree[rc].add+=tree[p].add;tree[p].add=0;}return ;
}
inline void build(int p,int l,int r){tree[p]={a[l],l,r,0};if (l==r) return ;int mid=tree[p].l+tree[p].r>>1;build(lc,l,mid);build(rc,mid+1,r);push_up(p);
}
inline void update(int p,int l,int r,int k){if (tree[p].l>=l && tree[p].r<=r){tree[p].sum+=k*(tree[p].r-tree[p].l+1);tree[p].add+=k;return ;}push_down(p);int mid=tree[p].r+tree[p].l>>1;if (mid>=l) update(lc,l,r,k);if (mid<r)	update(rc,l,r,k);push_up(p);
}
inline int query(int p,int l,int r){if (tree[p].l>=l && tree[p].r<=r){return tree[p].sum;}push_down(p);int mid=tree[p].l+tree[p].r>>1;int s=0;if (mid>=l)	s+=query(lc,l,r);if (mid<r)	s+=query(rc,l,r);return s; 
}
signed main(){int n,m;cin>>n>>m;for (int i=1;i<=n;++i)	cin>>a[i];build(1,1,n);for (int i=0;i<m;++i){int op;cin>>op;if (op==1){int a,b,c;cin>>a>>b>>c;update(1,a,b,c);}else if (op==2){int a,b;cin>>a>>b;int sum1=query(1,a,b);cout<<sum1<<endl;}}
}

Bad Hair Day Shttps://www.luogu.com.cn/problem/P2866

题目描述

农夫约翰有 �N 头奶牛正在过乱头发节。

每一头牛都站在同一排面朝右,它们被从左到右依次编号为 1,2,⋯ ,�1,2,⋯,N。编号为 �i 的牛身高为 ℎ�hi​。第 �N 头牛在最前面,而第 11 头牛在最后面。

对于第 �i 头牛前面的第 �j 头牛,如果 ℎ�>ℎ�+1,ℎ�>ℎ�+2,⋯ ,ℎ�>ℎ�hi​>hi+1​,hi​>hi+2​,⋯,hi​>hj​,那么认为第 �i 头牛可以看到第 �+1i+1 到第 �j 头牛。

定义 ��Ci​ 为第 �i 头牛所能看到的牛的数量。请帮助农夫约翰求出 �1+�2+⋯+��C1​+C2​+⋯+CN​。

输入格式

输入共 �+1N+1 行。

第一行为一个整数 �N,代表牛的个数。
接下来 �N 行,每行一个整数 ��ai​,分别代表第 1,2,⋯ ,�1,2,⋯,N 头牛的身高。

输出格式

输出共一行一个整数,代表 �1+�2+⋯+��C1​+C2​+⋯+CN​。

输入输出样例

输入 #1复制

6
10
3
7
4
12
2

输出 #1复制

5

说明/提示

数据规模与约定

对于 100%100% 的数据,保证 1≤�≤8×1041≤N≤8×104,1≤ℎ�≤1091≤hi​≤109。

思路:单调栈,单调减的栈,栈空时入栈,遇到比栈顶大的元素时出栈直到栈空或者栈顶栈顶元素更大,10入栈前,栈内没有元素,所以计数器+0,入栈,3比10小,入栈前计数器+1(栈的长度)由于7的长度大于3,所以3出栈,计数器+1,7入栈,4比7小,计数器+2,4入栈......

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long 
const int N=8e4+5;
int h[N];
stack<int>st;
signed main(){int n;cin>>n;int sum=0;for (int i=1;i<=n;++i)cin>>h[i];for (int i=1;i<=n;++i){while (!st.empty() && h[st.top()]<=h[i]){st.pop();}sum+=st.size();st.push(i);}cout<<sum;
}

01迷宫

 

题目描述

有一个仅由数字 00 与 11 组成的 �×�n×n 格迷宫。若你位于一格 00 上,那么你可以移动到相邻 44 格中的某一格 11 上,同样若你位于一格 11 上,那么你可以移动到相邻 44 格中的某一格 00 上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入格式

第一行为两个正整数 �,�n,m。

下面 �n 行,每行 �n 个字符,字符只可能是 00 或者 11,字符之间没有空格。

接下来 �m 行,每行两个用空格分隔的正整数 �,�i,j,对应了迷宫中第 �i 行第 �j 列的一个格子,询问从这一格开始能移动到多少格。

输出格式

�m 行,对于每个询问输出相应答案。

输入输出样例

输入 #1复制

2 2
01
10
1 1
2 2

输出 #1复制

4
4

说明/提示

对于样例,所有格子互相可达。

  • 对于 20%20% 的数据,�≤10n≤10;
  • 对于 40%40% 的数据,�≤50n≤50;
  • 对于 50%50% 的数据,�≤5m≤5;
  • 对于 60%60% 的数据,�,�≤100n,m≤100;
  • 对于 100%100% 的数据,1≤�≤10001≤n≤1000,1≤�≤1000001≤m≤100000。

思路:连通块问题,用搜索和并查集都可以

用 BFS的时候记得判重,不然会TLE

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long 
#define check(tx,ty) (tx>=1 && ty >=1 && tx<=n && ty<= n)	
const int N=1005;
int vis[N][N],a[N][N];
struct node{int x;int y;
}q[1000001];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int step[N][N];
signed main(){int n,m;cin>>n>>m;for (int i=1;i<=n;++i){for (int j=1;j<=n;++j){scanf("%1d",&a[i][j]);}}for (int i=0;i<m;++i){int sx,sy,tail=0,head=0;int cnt=1;cin>>sx>>sy;if (step[sx][sy]!=0){cout<<step[sx][sy]<<endl;continue;}q[tail].x=sx,q[tail].y=sy;step[sx][sy]=1;tail++;while (head<tail){int x=q[head].x,y=q[head].y;for (int i=0;i<4;++i){int tx=x+dir[i][0],ty=y+dir[i][1];if (check(tx,ty) && step[tx][ty]==0 && a[tx][ty]!=a[x][y]){q[tail].x=tx,q[tail].y=ty;step[tx][ty]=1;tail++;cnt++;}}head++;}for (int i=0;i<tail;++i){step[q[i].x][q[i].y]=cnt;}printf("%d\n",cnt);}
}

下面是并查集做法

遍历所有的点,如果两个点连通但未合并,那就合并

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long 
#define check(tx,ty) (tx>=1 && ty >=1 && tx<=n && ty<= n)	
const int N=1005;
int f[N*N];
int cnt[N*N];
int aa[N][N];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int find(int x){if (f[x]==x)return x;else{f[x]=find(f[x]);return f[x];}
}
void unionn(int i,int j){f[find(i)]=find(j);
}
signed main(){int m,n;cin>>n>>m;//初始化并查集for (int i=1;i<=n*n;++i){f[i]=i;cnt[i]=1;}for (int i=1;i<=n;++i){for (int j=1;j<=n;++j){scanf("%1d",&aa[i][j]);}}for (int i=1;i<=n;++i){for (int j=1;j<=n;++j){for (int k=0;k<4;++k){int a=i+dir[k][0],b=j+dir[k][1];if (a>=1 && a<=n && b>=1 && b<=n){if (aa[i][j]!=aa[a][b]){int x=find((i-1)*n+j);int y=find((a-1)*n+b);if (x!=y){unionn(x,y);cnt[y]+=cnt[x];	}}}}}}while (m--){int sx,sy;cin>>sx>>sy;cout<<cnt[find((sx-1)*n+sy)]<<endl;}
}

健康的荷斯坦奶牛 Healthy Holsteinshttps://www.luogu.com.cn/problem/P1460

题目描述

农民 John 以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。

给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。

维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。

输入格式

第一行一个整数 �v,表示需要的维他命的种类数。
第二行 �v 个整数,表示牛每天需要的每种维他命的最小量。

第三行一个整数 �g,表示可用来喂牛的饲料的种数。
下面 �g 行,第 �n 行表示编号为 �n 饲料包含的各种维他命的量的多少。

输出格式

输出文件只有一行,包括牛必需的最小的饲料种数 �p;后面有 �p 个数,表示所选择的饲料编号(按从小到大排列)。

如果有多个解,输出饲料序号最小的(即字典序最小)。

输入输出样例

输入 #1复制

4
100 200 300 400
3
50  50  50  50
200 300 200 300
900 150 389 399

输出 #1复制

2 1 3

说明/提示

【数据范围】
对于 100%100% 的数据,1≤�≤251≤v≤25,1≤�≤151≤g≤15。
输入的所有整数在 [1,1000][1,1000] 范围内。

思路:DFS排列问题

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long 
const int N=1000;
int v[N],g[N][N],ans[N],c[N];
int m,n,minx=100000000;
bool check(int x){for (int i=1;i<=n;++i){int sum=0;for (int j=1;j<=x;++j){sum+=g[c[j]][i];}if (sum<v[i])return false;}return true;
}
void dfs(int t , int s){if (s>minx) return ;if (t>m){	if (check(s)){if (s<minx){minx=s;for (int i=1;i<=minx;++i){ans[i]=c[i];}}}return ;}c[s+1]=t;dfs(t+1,s+1);c[s+1]=0;dfs(t+1,s);
}
signed main(){cin>>n;for (int i=1;i<=n;++i)	cin>>v[i];cin>>m;for (int i=1;i<=m;++i){for (int j=1;j<=n;++j){cin>>g[i][j];}}dfs(1,0);cout<<minx<<" ";for (int i=1;i<=minx;++i){cout<<ans[i]<<" ";}
}

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

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

相关文章

政安晨的机器学习笔记——跟着演练快速理解TensorFlow(适合新手入门)

准备工作 本笔记是假设您已经安装了Windows系统或Ubuntu系统的Anaconda&#xff08;或 Miniconda&#xff09;、Jupyter Notebook、TensorFLow&#xff0c;稍微了解Python语言&#xff0c;并可以进行一点点操作的基础上进行的。 如果您还不具备这个条件&#xff0c;去…

java 图书管理系统 spring boot项目

java 图书管理系统ssm框架 spring boot项目 功能有管理员模块&#xff1a;图书管理&#xff0c;读者管理&#xff0c;借阅管理&#xff0c;登录&#xff0c;修改密码 读者端&#xff1a;可查看图书信息&#xff0c;借阅记录&#xff0c;登录&#xff0c;修改密码 技术&#…

基于OpenCV的高压电力检测项目案例

一、项目背景与目标 随着高压电力设施的日益增多&#xff0c;传统的巡检方式已无法满足现代电力系统的需求。为此&#xff0c;我们决定利用计算机视觉技术&#xff0c;特别是OpenCV库&#xff0c;开发一个高压电力检测系统。目标是实现自动化、高精度的电力设备检测&#xff0c…

C#常见内存泄漏

背景 在开发中由于对语言特性不了解或经验不足或疏忽&#xff0c;往往会造成一些低级bug。而内存泄漏就是最常见的一个&#xff0c;这个问题在测试过程中&#xff0c;因为操作频次低&#xff0c;而不能完全被暴露出来&#xff1b;而在正式使用时&#xff0c;由于使用次数增加&…

AI学习(4): PyTorch实战-手写数字识别

1.介绍 在之前的文章中介绍了PyTorch的环境安装&#xff0c;和张量(tensor)的基本使用&#xff0c;为防止陷入枯燥的理论学习中&#xff0c;在这篇文章&#xff0c;我们将进行项目实战学习&#xff0c;项目主要内容: 基于MNIST数据集&#xff0c;实现一个手写数字识别的神经网…

jdk17新特性—— 密封类(Sealed Classes)

目录 一、密封类(Sealed Classes)的概述1.1、概述1.2、特性1.3、注意事项 二、密封类(Sealed Classes)代码示例2.1、密封类(Sealed Classes)代码结构示例2.2、密封类(Sealed Classes)代码示例 三、密封类(Sealed Classes)接口代码示例3.1、密封类(Sealed Classes)接口代码结构示…

浙大团队撰写75页科学语言大模型综述,全面梳理Sci-LLMs最新研究进展

大型语言模型&#xff08;LLMs&#xff09;已成为推动自然语言理解能力变革的关键力量&#xff0c;标志着人工智能通用性方面的重大突破。LLMs 的应用已超越传统自然语言的范畴&#xff0c;覆盖了各类科学学科中开发的专用科学语言系统&#xff0c;从而推动了科学语言大模型&am…

嵌入式学习第十四天

1.结构体&#xff08;2&#xff09;: &#xff08;1&#xff09;结构体类型定义 &#xff08;2&#xff09;结构体变量的定义 &#xff08;3&#xff09;结构体元素的访问 &#xff08;4&#xff09;结构体的存储: 内存对齐: char 按照1字节对齐 …

Coppeliasim倒立摆demo

首先需要将使用Python远程控制的文件导入到文件夹&#xff0c;核心是深蓝色的三个文件。 本版本为4.70&#xff0c;其文件所在位置如下图所示&#xff0c;需要注意的是&#xff0c;目前不支持Ubuntu22的远程api&#xff1a; 双击Sphere这一行的灰色文件&#xff0c;可以看到远程…

【Redis】理论基础 - 概览

文章目录 1. 定义2. 主要特性1&#xff09;内存存储2&#xff09;数据结构多样性3&#xff09;持久化4&#xff09;主从复制5&#xff09;事务支持 3. 使用场景1&#xff09;缓存2&#xff09;消息队列3&#xff09;实时统计与计数4&#xff09;分布式锁 总结 Redis&#xff08…

探索设计模式的魅力:精准解读桥接模式-用桥接模式构建可扩展的软件系统

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 目录 一、了解桥接模式&#xff1a;探索抽象和实现的分离 1.1 开-闭原则 1.2 组合/聚合复用原则 1.3 定义 1.4 用意 1.5 基本思想 1.6 组成部分 1.7 桥梁模式的示意性系统的结构图 二、桥接模式的优势&#xff1a…

android远程投屏应用

客户端app地址&#xff1a;https://gitee.com/youzilzk/blue1.git 服务端地址&#xff1a;https://gitee.com/youzilzk/blue-server1.git 一。服务端部署 1.安装postgres 2.导入项目下blue.sql文件 3.修改配置application.properties和config.properties&#xff0c;其中applic…

Qt 基础之QDataTime

Qt 基础之QDataTime 引言一、获取(设定)日期和时间二、时间戳三、时间计算 (重载运算符) 引言 QDataTime是Qt框架中用于处理日期和时间的类。它提供了操作和格式化日期、时间和日期时间组合的功能。QDataTime可以用于存储和检索日期和时间、比较日期和时间、对日期和时间执行算…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”&#xff0c;这就是ABC输入法&#xff0c;点击上面的Delete按钮&#xff0c;删除整项ABC内容&#xff0c…

2023强网杯复现

强网先锋 SpeedUp 要求2的27次方的阶乘的逐位之和 在A244060 - OEIS 然后我们将4495662081进行sha256加密 就得到了flag flag{bbdee5c548fddfc76617c562952a3a3b03d423985c095521a8661d248fad3797} MISC easyfuzz 通过尝试输入字符串判断该程序对输入字符的验证规则为9…

01、全文检索 ------ 反向索引库 与 Lucene 的介绍

目录 全文检索 ------ 反向索引库 与 LuceneSQL模糊查询的问题反向索引库反向索引库的查询 Lucene&#xff08;全文检索技术&#xff09;Lucene能做什么Lucene存在的问题Solr 和 Elasticsearch 与 Lucene 的关系 全文检索 ------ 反向索引库 与 Lucene MySQL一些索引词汇解释 …

如何使用Docker部署JSON Crack

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷9

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

【算法】Partitioning the Array(数论)

题目 Allen has an array a1,a2,…,an. For every positive integer k that is a divisor of n, Allen does the following: He partitions the array into n/k disjoint subarrays of length k. In other words, he partitions the array into the following subarrays: [a1,…

3 款最好的电脑硬盘数据迁移软件

您将从本页了解 3 款最好的 SSD硬盘数据迁移软件&#xff0c;磁盘供应商提供的软件和可靠的第三方软件。仔细阅读本文并做出您的选择。 什么是数据迁移&#xff1f; 数据迁移是将数据移动到其他计算机或存储设备的过程。在日常工作活动中&#xff0c;常见的数据迁移有三种&…