数据结构小总结(成都磨子桥技工学校数据结构前12题)

这里写图片描述
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=34352147
暑假的作业,颓颓的我总算是写完了
这里写图片描述

线段树

线段树是一个高级玩意,不仅可以求区间和,区间最大等等的简单问题,灵活运用还有好多变种。自从学了主席树,知道了null自环这种东西后,用在线段树上也是得心应手

c3

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)修改数列中的一个数
(2)求数列中某连续一段的和

赤裸裸的线段树

c4

给一个长为N的数列,有M次操作,每次操作时以下三种之一:
(1)修改数列中的一个数
(2)求数列中某连续一段所有数的两两乘积的和 mod 1000000007
(3)求数列中某连续一段所有相邻两数乘积的和 mod 1000000007

数据剧毒无比,有负数,取模就出问题了。对于区间维护答案,主要就是如何合并区间。操作3好合并,只要记录每个区间的头、尾的数,把左右儿子区间的和加起来,再加上中间两个数的乘积。关键是操作2,要是没有见识过这个脑筋急转弯,我可能一辈子都不会:

给出N个数, 每次可以合并两个数, 合并的代价是两个数的乘积, 合并得到的数是两个数的和。
问最后把所有数合并成一个数的最小代价。 求这个最小代价对10^9+7取模的结果。
N <= 5000000。

题解是:

显然无论怎么合并答案都是一样的, 任意两个数的乘积恰好会对答案贡献一次。
直接搞就好了

于是这道题的操作2就迎刃而解了
由于这道题坑很多,我就不放我wa掉的代码了
大神的AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
const int mod=1000000007;
struct Node{int s1,s2,s3;
}node[maxn<<2];
int a[maxn];
int n,m;
int slow_mult(int a,int p){if(a<0)a=(a+(mod<<1))%mod;if(p<0)p =(p+(mod<<1))%mod;if(a<p)swap(a,p);if(p==0)return 0;if(p==1)return a%mod;int tmp=slow_mult(a,p>>1);if(p&1)return ((tmp<<1)%mod+a%mod)%mod;else return (tmp<<1)%mod;
}
inline void update(int root,int l,int r){node[root].s1=(node[root<<1].s1+node[root<<1|1].s1)%mod;node[root].s2=(node[root<<1].s2+node[root<<1|1].s2)%mod;int m=(l+r)>>1;node[root].s3=((node[root<<1].s3+node[root<<1|1].s3)%mod+slow_mult(a[m],a[m+1]))%mod;
}
void build(int root,int l,int r){if(l==r){node[root].s1=a[l];node[root].s2=slow_mult(a[l],a[r]);node[root].s3=0;return ;}int m=(l+r)>>1;build(root<<1,l,m),build(root<<1|1,m+1,r);update(root,l,r);
}
void modify(int root,int l,int r,int x,int val){if(l==r){node[root].s1=val;node[root].s2=slow_mult(val , val);node[root].s3=0;a[x]=val;return;}int m=(l+r)>>1;if(x<=m)modify(root<<1,l,m,x,val);else modify(root<<1|1,m+1,r,x,val);update(root,l,r);
}
int query1(int root,int l,int r,int x,int y){if(x<=l&&r<=y)return node[root].s1;int m=(l+r)>>1,ret=0;if(x<=m&&l<=y)ret+=query1(root<<1,l,m,x,y);if(y>=m+1&&r>=x)ret+=query1(root<<1|1,m+1,r,x,y);return ret % mod;
}
int query2(int root,int l,int r,int x,int y){if(x<=l&&r<=y)return node[root].s2;int m=(l+r)>>1,ret=0;if(x<=m&&l<=y)ret+=query2(root<<1,l,m,x,y);if(y>=m+1&&r>=x)ret+=query2(root<<1|1,m+1,r,x,y);return ret % mod;
}
int query3(int root,int l,int r,int x,int y){if(x<=l&&r<=y)return node[root].s3;int m=(l+r)>>1,ret=0,flag=1;if(x<=m&&l<=y)ret+=query3(root<<1,l,m,x,y),flag*=-1;if(y>=m+1&&r>=x)ret+=query3(root<<1|1,m+1,r,x,y),flag*=-1;if(flag^1)return ret%mod;else return(ret%mod+slow_mult(a[m],a[m+1]))%mod;
}
void read(int &res){int flag=1;static char ch;while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48;while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;
}
void reads(char &res){static char ch;while((ch=getchar())!='Q'&&ch!='M'&&ch!='A');res=ch;
}
int main(){read(n),read(m);for(int i=1;i<=n;i++)read(a[i]),a[i]%=mod;build(1,1,n);for(int i=1;i<=m;i++){char cmd;int x,y;reads(cmd);read(x),read(y);if(cmd=='M')modify(1,1,n,x,y%mod);else if(cmd=='Q'){int t1=query1(1,1,n,x,y);int t2=query2(1,1,n,x,y);t1=slow_mult(t1,t1);int tmp=t1-t2;if(tmp<0||tmp&1)tmp+=mod;if(tmp&1)tmp+=mod;printf("%d\n",(tmp>>1)%mod);}else printf("%d\n",query3(1,1,n,x,y));}return 0;
}

c5

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)将某连续一段同时改成一个数
(2)求数列中某连续一段的和

也是很基本的线段树

c6

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)修改数列中的一个数
(2)求数列中有多少个数比它前面的数都大

其实是裸的楼房重建,线段树代码见这里
然后听说这道题用分块也能过,为了练习练习,这次就用分块了

#include<cstdio>
#include<cstring> 
#include<algorithm>
#include<cmath>
#include<vector> 
using namespace std;const int N=100000+5;
const int B=400;
const int oo=0x7fffffff;int n,m,hh[N];
vector<int> a[B];
int blk,pos[N];void getsort(int x){int maxx=-oo;a[x].clear();for(int i=(x-1)*blk+1;i<=min(n,x*blk);i++){if(hh[i]>maxx){a[x].push_back(i);maxx=hh[i];} }
}
void init(){for(int i=1;i<=pos[n];i++){getsort(i);}
}
int erfen(int maxx,int x){int le=1,ri=a[x].size();while(le<ri){int mid=(le+ri)>>1;if(hh[a[x][mid-1]]<=maxx) le=mid+1;else ri=mid; }if(hh[a[x][le-1]]<=maxx){return 0;} return a[x].size()-le+1;
}
int query(){int ans=0,maxx=-oo;for(int i=1;i<=pos[n];i++){ans+=erfen(maxx,i);maxx=max(maxx,hh[a[i][a[i].size()-1]]);}return ans;
}
int main(){scanf("%d%d",&n,&m);blk=(int)sqrt((double)n);for(int i=1;i<=n;i++){scanf("%d",&hh[i]);pos[i]=(i-1)/blk+1;} init();while(m--){char opt[2];scanf("%s",opt);if(opt[0]=='M'){int x,y;scanf("%d%d",&x,&y);hh[x]=y;getsort(pos[x]);}else{printf("%d\n",query());}}return 0;
}

c7

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)修改数列中的一个数
(2)求数列中某个值出现了多少次

在做c8之前是没有想到用值域线段树的,以为会爆空间(int级别的),就偷了个懒,用map
如何处理值域线段树的空间问题,见c8

#include<cstdio> 
#include<cstring> 
#include<map> 
#include<algorithm> 
using namespace std;const int N=100000+5;map<int,int> mp;
int a[N];int main(){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);mp[a[i]]++;}while(m--){char opt[2];scanf("%s",opt);if(opt[0]=='M'){int x,y;scanf("%d%d",&x,&y);mp[a[x]]--;mp[y]++;a[x]=y;}else{int x;scanf("%d",&x);printf("%d\n",mp[x]);}}return 0;
}

c8

给一个长为N的数列,有M次操作,每次操作是以下三种之一:
(1)插入一个数,若已存在则忽略
(2)删除一个数,若不存在则忽略
(3)求数列中任意两数之差绝对值的最小值

先不考虑空间问题,我一来就想到值域线段树。计算存在的数与最近的前后两数的差值的最小值。每个区间储存存在的最小数和最大数。合并时,左区间的ans,右区间的ans,左区间最大数和右区间的最小数的差,取min。
那么怎么处理空间大小问题呢?数据是2^31,但N,M的范围是10^5,也就是说最少都有2^31-10^5的数根本和此题无关,是浪费空间。其维护的值都是一样的,那么为什么不指向同一个空间呢?于是就把主席树里的null搬过来,不存在的值就由null代替
然后我猜数据里有负数,结果在划分区间是没注意向上还是向下取整的问题,结果T掉了,全部都加上正无穷就好了。之后又没开longlong,int加爆了。。。orz

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;const ll oo=2147483646;
const ll N=100000+5;ll n,m;
struct Node{Node *ls,*rs;ll ans,maxn,minn,cnt;
}*root,*null,pool[N*80],*tail=pool;Node *newnode(){Node *rt=++tail;rt->ls=rt->rs=null;rt->ans=oo;rt->maxn=rt->minn=rt->cnt=0;return rt;
}
void update(Node *nd){nd->cnt=nd->ls->cnt+nd->rs->cnt;nd->ans=oo;if(nd->ls->cnt>1) nd->ans=min(nd->ans,nd->ls->ans);if(nd->rs->cnt>1) nd->ans=min(nd->ans,nd->rs->ans);if(nd->ls->cnt&&nd->rs->cnt) nd->ans=min(nd->ans,nd->rs->minn - nd->ls->maxn);if(nd->rs->cnt) nd->maxn=nd->rs->maxn;else nd->maxn=nd->ls->maxn;if(nd->ls->cnt) nd->minn=nd->ls->minn;else nd->minn=nd->rs->minn;
}
void insert(Node *&nd,ll le,ll ri,ll pos){if(nd==null) nd=newnode();if(le==ri){nd->cnt=1;nd->ans=oo;nd->maxn=nd->minn=pos;return;}ll mid=(le+ri)/2;if(pos<=mid) insert(nd->ls,le,mid,pos);else insert(nd->rs,mid+1,ri,pos);update(nd);
}
void del(Node *&nd,ll le,ll ri,ll pos){if(nd==null) return ;if(le==ri){nd->cnt=0;nd->ans=nd->maxn=nd->minn=0;return ;}ll mid=(le+ri)/2;if(pos<=mid) del(nd->ls,le,mid,pos);else del(nd->rs,mid+1,ri,pos);update(nd);
}
int main(){null=++tail;null->ls=null->rs=null;null->ans=null->minn=null->maxn=null->cnt=0;root=null;scanf("%lld%lld",&n,&m);ll a;for(ll i=1;i<=n;i++){scanf("%lld",&a);insert(root,0,oo+oo,a+oo);}while(m--){char opt[2];ll x;scanf("%s",opt);if(opt[0]=='I'){scanf("%lld",&x);insert(root,0,oo+oo,x+oo);}else if(opt[0]=='D'){scanf("%lld",&x);del(root,0,oo+oo,x+oo);}else {if(root->cnt>1) printf("%lld\n",root->ans);else printf("-1\n");}}
}

c10

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)修改数列中的一个数
(2)求数列中第K小的值

第k大问题,想来都是线段树。由于每次要修改数据,离散化不太可能,那么就用上文提到的null来节省空间(哎呀我真是太机智了,自己yy出来的诶,也算是进步吧)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long 
using namespace std;const ll N=100000+5;
const ll oo=2147483646;struct Node {Node *ls,*rs;ll cnt;
}*root,*null,pool[N*80],*tail=pool;
ll n,m,a[N];Node *newnode(){Node *rt=++tail;rt->ls=rt->rs=null;rt->cnt=0;return rt;
}
void modify(Node *&nd,ll le,ll ri,ll pos,ll val){if(nd==null) nd=newnode();if(le==ri){nd->cnt+=val;return ;}ll mid=(le+ri)>>1;if(pos<=mid) modify(nd->ls,le,mid,pos,val);else modify(nd->rs,mid+1,ri,pos,val);nd->cnt=nd->ls->cnt+nd->rs->cnt;
} 
ll query(Node *nd,ll le,ll ri,ll pos){if(le==ri)return le;ll mid=(le+ri)>>1;if(pos<=nd->ls->cnt) return query(nd->ls,le,mid,pos);else return query(nd->rs,mid+1,ri,pos-nd->ls->cnt);
}
int main(){null=++tail;null->ls=null->rs=null;null->cnt=0;root=null;scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);modify(root,0,oo+oo,a[i]+oo,1);}while(m--){char opt[2];scanf("%s",opt);if(opt[0]=='Q'){ll x;scanf("%lld",&x);printf("%lld\n",query(root,0,oo+oo,x)-oo);}else {ll x,y;scanf("%lld%lld",&x,&y);modify(root,0,oo+oo,a[x]+oo,-1);modify(root,0,oo+oo,y+oo,1);a[x]=y;}}return 0;
}

总结:
线段树可腻害可腻害了,其实很多的区间问题都可以解决,唯一的关键点就是如何快速的区间合并。俗话说“以不变应万变”,只要解决区间合并的方法就可以了。

主席树

c2

给一个空数列,有M次操作,每次操作是以下三种之一:
(1)在数列后加一个数
(2)求数列中某位置的值
(3)撤销掉最后进行的若干次操作(1和3)

感觉像是数组,又感觉像是主席树。但是数组又不易用指针写,于是一气之下杀鸡用牛刀,用线段树来解决数列问题。。。1A

#include<cstdio> 
#include<cstring> 
#include<algorithm> 
using namespace std;const int N=100000+5;struct Node{Node *ls,*rs;int val;
}*root[N],*null,pool[N*50],*tail=pool;
int len[N],m;Node *newnode(){Node *rt=++tail;rt->ls=rt->rs=null;rt->val=0;return rt;
}
void insert(Node *np,Node *&nd,int le,int ri,int pos,int val){nd=newnode();nd->ls=np->ls,nd->rs=np->rs;nd->val=np->val;if(le==ri){nd->val=val;return ;}int mid=(le+ri)>>1;if(pos<=mid) insert(np->ls,nd->ls,le,mid,pos,val);else insert(nd->rs,nd->rs,mid+1,ri,pos,val);
}
int query(Node *nd,int le,int ri,int pos){if(le==ri) return nd->val;int mid=(le+ri)>>1;if(pos<=mid) return query(nd->ls,le,mid,pos);else return query(nd->rs,mid+1,ri,pos);
}
int main(){null=++tail;null->ls=null->rs=null;null->val=0;root[0]=null;scanf("%d",&m);int cnt=0;while(m--){char opt[2];int x;scanf("%s%d",opt,&x);if(opt[0]=='A'){cnt++;len[cnt]=len[cnt-1]+1;insert(root[cnt-1],root[cnt],1,N,len[cnt],x);}else if(opt[0]=='Q'){printf("%d\n",query(root[cnt],1,N,x));}else{cnt++;root[cnt]=root[cnt-x-1];len[cnt]=len[cnt-x-1]; }}return 0;
}

c11

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)修改数列中的一个数
(2)求某次操作后连续一段的和

裸主席树,就当练手速吧

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N=100000+5;struct Node{Node *ls,*rs;int sum;
}*root[N],*null,pool[N*80],*tail=pool;
int n,m,a[N];Node *newnode(){Node *rt=++tail;rt->ls=rt->rs=null;rt->sum=0;return rt;
}
void build(Node *&nd,int le,int ri){nd=newnode();if(le==ri){nd->sum=a[le];return ;}int mid=(le+ri)>>1;build(nd->ls,le,mid);build(nd->rs,mid+1,ri);nd->sum=nd->ls->sum+nd->rs->sum;
}
void insert(Node *ne,Node *&nd,int le,int ri,int pos,int val){nd=newnode();nd->ls=ne->ls,nd->rs=ne->rs;if(le==ri){nd->sum=val;return ;}int mid=(le+ri)>>1;if(pos<=mid) insert(ne->ls,nd->ls,le,mid,pos,val);else insert(ne->rs,nd->rs,mid+1,ri,pos,val);nd->sum=nd->ls->sum+nd->rs->sum;
}
int query(Node *nd,int le,int ri,int L,int R){if(L<=le&&ri<=R) return nd->sum;int mid=(le+ri)>>1,rt=0;if(L<=mid) rt+=query(nd->ls,le,mid,L,R);if(mid<R) rt+=query(nd->rs,mid+1,ri,L,R);return rt;
}
int main(){null=++tail;null->ls=null->rs=null;null->sum=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);build(root[0],1,n);for(int i=1;i<=m;i++){char opt[2];scanf("%s",opt);if(opt[0]=='M'){int x,y;scanf("%d%d",&x,&y);insert(root[i-1],root[i],1,n,x,y);}else{int x,y,z;scanf("%d%d%d",&x,&y,&z);printf("%d\n",query(root[z],1,n,x,y));root[i]=root[i-1];}}return 0;
}

c12

给一个长为N的数列,有M次操作,操作仅有一种:
求数列中某连续一段中第K小的值

还是裸的主席树,没错我是来挂代码的

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long 
using namespace std;const ll N=100000+5;
const ll oo=2147483646;struct Node {Node *ls,*rs;ll cnt;
}*root[N],*null,pool[N*100],*tail=pool;
ll n,m,a[N];Node *newnode(){Node *rt=++tail;rt->ls=rt->rs=null;rt->cnt=0;return rt;
}
void insert(Node *ne,Node *&nd,ll le,ll ri,ll pos){nd=newnode();nd->ls=ne->ls,nd->rs=ne->rs;nd->cnt=ne->cnt+1;if(le==ri) return;ll mid=(le+ri)>>1;if(pos<=mid) insert(ne->ls,nd->ls,le,mid,pos);else insert(ne->rs,nd->rs,mid+1,ri,pos);
}
ll query(Node *ne,Node *nd,ll le,ll ri,ll k){if(le==ri) return le;ll mid=(le+ri)>>1;ll lsc=nd->ls->cnt - ne->ls->cnt;if(k<=lsc) return query(ne->ls,nd->ls,le,mid,k);else return query(ne->rs,nd->rs,mid+1,ri,k-lsc);
}
int main(){null=++tail;null->ls=null->rs=null;null->cnt=0;root[0]=null;scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);insert(root[i-1],root[i],0,oo+oo,a[i]+oo);}while(m--){ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);printf("%lld\n",query(root[x-1],root[y],0,oo+oo,z)-oo);}return 0;
}

数组

c0,c1
太简单啦,寒假做的

平衡树

c9

给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)删除某个位置的数
(2)求数列某位置的值

一来就想到treap,但是感觉大材小用了,就偷了个懒

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;vector<int> vec;
int n,m;int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int a;scanf("%d",&a);vec.push_back(a);}while(m--){char opt[2];int x;scanf("%s%d",opt,&x);x--;if(opt[0]=='D')vec.erase(vec.begin()+x);else printf("%d\n",vec[x]);}return 0;
}

好啦,就是这样

转载于:https://www.cnblogs.com/LinnBlanc/p/7763147.html

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

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

相关文章

wav2midi 音乐旋律提取算法 附可执行demo

前面提及过&#xff0c;音频指纹算法的思路。 也梳理开源了两个比较经典的算法。 https://github.com/cpuimage/shazam https://github.com/cpuimage/AudioFingerprinter 后来一段时间&#xff0c;稍微看了下这两个算法&#xff0c;还有不少可以精简优化的空间。 例如抗噪&…

全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式

Dora.Interception提供了两种拦截器注册方式&#xff0c;一种是利用标注在目标类型、属性和方法上的InterceptorAttribute特性&#xff0c;另一种采用基于目标方法或者属性的调用表达式。通过提供的扩展点&#xff0c;我们可以任何我们希望的拦截器注册方式。目录一、IIntercep…

SCAU 算法课的题

8594 有重复元素的排列问题&#xff08;优先做&#xff09; 时间限制:1000MS 内存限制:1000K提交次数:1610 通过次数:656 题型: 编程题 语言: G;GCC;VC Description 设集合R{r1,r2,...,rn}是要进行排列的n个元素&#xff0c;其中r1,r2,...,rn可能相同。 试着设计一个算法&am…

react 数组新增_React 新特性 Hooks 讲解及实例(二)

本文是 React 新特性系列的第二篇&#xff0c;第一篇请点击这里&#xff1a;React 新特性讲解及实例什么是 HooksHook 是 React 16.8 的新增特性。它可以让你在不编写 类组件 的情况下使用 state以及其他的 React 特性。类组件的不足状态逻辑复用难缺少复用机制渲染属性和高阶组…

7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据

当探索具有中等数量(不多不少的意思……)维度的数据集时&#xff0c;一个很好的方式是基于不同的子数据集构建不同的实例&#xff0c;并将它们以网格的方式组织在一张图之中。这种技术有时被称为“lattice”或“trellis”(大概是格子图、网格图)&#xff0c;这跟“small multip…

面对峰值响应冲击,解决高并发的三大策略

2019独角兽企业重金招聘Python工程师标准>>> 当前在互联网的大潮下&#xff0c;众所周知淘宝、京东这些交易系统每天产生的数据量都是海量的&#xff0c;每天的交易并发也是惊人的&#xff0c;尤其是“双11”、“6.18”这些活动&#xff0c;对系统的峰值响应提出了非…

hibernate mysql 主从_MYSQL主从复制和写分离

基础篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理

本系列前面的五篇文章主要介绍Dora.Interception的编程模式以及对它的扩展定制&#xff0c;现在我们来聊聊它的设计和实现原理。目录一、调用链抽象二、基于约定的拦截器定义三、基于调用上下文的依赖注入容器四、拦截器的提供五、调用链的构建六、方法拦截的实现原理七、依赖注…

完成登录与注册页面的前端

完成登录与注册页面的HTMLCSSJS&#xff0c;其中的输入项检查包括&#xff1a; 用户名6-12位 首字母不能是数字 只能包含字母和数字 密码6-12位 注册页两次密码是否一致 JS&#xff1a; function fnLogin() {var uSer document.getElementById("user");var pAss do…

WPF效果第二百零一篇之实现合并单元格

早一段时间又一次出差青海省西宁市;回来又是总结又是各种琐事,也没顾得上去分享点东西;大周末的就在家分享一下,这二天再次基于ListBox实现的合并单元格的效果:1、ListBox嵌套ListBox的前台布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

ASP.NET Core中使用EasyCaching作为缓存抽象层

简介做后端开发&#xff0c;缓存应该是天天在用&#xff0c;很多时候我们的做法是写个帮助类&#xff0c;然后用到的时候调用一下。这种只适合简单层次的应用&#xff1b;一旦涉及到接口实现调整之类的&#xff0c;这种强耦合的做法很不合适。有些其他的功能又要去重复造轮子。…

visual studio开启多核编译方法

先按http://blog.csdn.net/acaiwlj/article/details/50240625的方法进行了VS多线程的启动。 原本以为按以下步骤设置就OK了&#xff0c;但是编译中无意间发些了一个warning&#xff1a;“/Gm”与多处理不兼容&#xff1b;忽略 /MP 开关&#xff01;&#xff01;&#xff01;&am…

聊聊storm nimbus的LeaderElector

为什么80%的码农都做不了架构师&#xff1f;>>> 序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java public static void main(String[] args) throws Exception {Utils.setupDefaultUncaughtExceptionHandler();…

如果我去深圳,你会见我吗

▲图/ 深圳夜景初次见易小姐&#xff0c;还是21年的春节回老家的时候。想来20年因为疫情没有回家&#xff0c;家母几次三番电话里头表达的思念以及建议一些不靠谱的回家计划&#xff0c;着实有些不忍&#xff0c;确实有似“儿行千里母担忧”之理&#xff0c;索性拿着年假和加班…

开源轻量的 .NET 监控工具 - 看门狗

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介WatchDog 是一个使用 C# 开发的开源的轻量监控工具&#xff0c;它可以记录和查看 ASP.Net Core Web 和 WebApi 的实时消息、事件、…

BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂

http://www.lydsy.com/JudgeOnline/problem.php?id3231和斐波那契一个道理在最后加一个求和即可1 #include<cstdio>2 #include<cstring>3 #include<iostream>4 //using namespace std;5 const int maxn10010;6 const double eps1e-8;7 long long modn;8 lon…

马斯克的火箭上天了,SpaceX开源项目也登上了热榜!

python知识手册SpaceX于美国东部时间5月30日下午3&#xff1a;22分将两位美国宇航员送往国际空间站&#xff0c;虽然这只是Demo任务&#xff0c;但SpaceX已经以其卓越工程优势、低廉的发射成本赢得了全球航天产业的信赖。同时也是除美俄中这些航天国家队以外&#xff0c;唯一独…

机器视觉Halcon教程(1.介绍)

前言本期教程主要教大家如何使用Halcon机器视觉&#xff0c;通过使用Halcon, 我们可以实现一些机器视觉的应用开发。例如: OCR识别、视觉定位、缺陷检测等内容。什么是halcon&#xff1f;简单来说, Halcon就是一款应用于机器视觉的软件&#xff0c;它提供了一套开发工具&#x…

网络时间的那些事及 ntpq 详解

2019独角兽企业重金招聘Python工程师标准>>> GMT (Greenwich Mean Time)格林威治时间 UTC (Coordinated Universal Time) 协调世界时 IAT (International Atomic Time),TAI 国际原子时 CST (Chinese Standard Time), 北京时间Gentoo&#xff08;也许其他发行版也是&…

【前端芝士树】Javascript的原型与原型链

【前端芝士树】Javascript的原型、原型链以及继承机制 前端的面试中经常会遇到这个问题&#xff0c;自己也是一直似懂非懂&#xff0c;趁这个机会整理一下0. 为什么会出现原型和原型链的概念 1994年&#xff0c;网景公司&#xff08;Netscape&#xff09;发布了Navigator浏览器…