T1 树上的数

考场上比较脑瘫没有想到直接dfs就行了这样是O(n+m)的,傻不拉几地多添了个log,

不过因为accoder的评测机太弱了,绝大多数人的正解都是60分,所以没有什么差别;

直接dfs,d到不能d的点就return就好了

  1. #include<bits/stdc++.h>
  2. #define lid id<<1
  3. #define rid id<<1|1
  4. using namespace std;
  5. inline int read()
  6. {
  7. int x=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  10. return x*f;
  11. }
  12. int n,m,a,b;
  13. const int mod=19760817, maxn=5e6+5;
  14. int fa[maxn],q[maxn],sum[2];
  15. int head[maxn],num;
  16. struct edge{int to,nxt;}e[maxn<<1];
  17. inline void add(int x,int y)
  18. {e[++num]=(edge){y,head[x]};head[x]=num;}
  19. bool vis[maxn];
  20. inline void dfs(int x)
  21. {
  22. if(vis[x]) return;
  23. vis[x]=1;++sum[1];
  24. for(int i=head[x];i;i=e[i].nxt)
  25. dfs(e[i].to);
  26. }
  27. signed main()
  28. {
  29. freopen("tree.in","r",stdin);
  30. freopen("tree.out","w",stdout);
  31. n=read();m=read();a=read();b=read();
  32. q[1]=read(); int x=read(),y=read();
  33. fa[2]=1; add(1,2); for(int i=3;i<=n;i++)
  34. fa[i]=((1ll*fa[i-1]*a+b)^mod)%(i-1)+1,add(fa[i],i);
  35. sum[1]=0;int ans=0; if(!vis[q[1]])dfs(q[1]);ans^=(n-sum[1]);
  36. for(int i=2;i<=m;i++)
  37. {
  38. q[i]=(((1ll*q[i-1]*x+y)^mod)^(i<<1))%(n-1)+2;
  39. dfs(q[i]);ans^=(n-sum[1]);
  40. }
  41. printf("%d\n",ans);
  42. }

T2 时代的眼泪

看到这个题目的时候有点慌,以为是那个dio题,结果后来发现只是题目一样,一个比较显然的换根

将以x为根变为他的儿子y为根,他的变化量是在除了y的子树之外的点比y小的点的个数减去y的子树里比x小的数的个数

可以先dfs出来根为1的最终答案,然后用树状数组处理出对应变化量,最后再dfs一次换根就行了

复杂度O(n*log(n))。不过考场上我没有想到如何用树状数组解决这个问题,在dfs序上开了一棵主席树

复杂度也是O(nlog(n))的,不过常数比较大,再加上那个OJ比较慢,最后只有90分

主席树写法:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. inline int read()
  4. {
  5. int x=0,f=1;char ch=getchar();
  6. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  8. return x*f;
  9. }
  10. const int maxn=1e6+5;
  11. struct edge{int to,nxt;}e[maxn<<1];
  12. int head[maxn],num,w[maxn],lsh[maxn],ext,n;
  13. inline void add(int x,int y)
  14. {
  15. e[++num]=(edge){y,head[x]};head[x]=num;
  16. e[++num]=(edge){x,head[y]};head[y]=num;
  17. }
  18. struct szsz{
  19. #define lowbit(x) (x&(-x))
  20. int c[maxn];
  21. inline int query(int x){int res=0;for(;x;x-=lowbit(x))res+=c[x];return res;}
  22. inline void update(int x,int val){for(;x<=ext;x+=lowbit(x))c[x]+=val;}
  23. }z;
  24. int dfn[maxn],pp[maxn],cnt,siz[maxn];
  25. long long ans[maxn];
  26. inline void dfs1(int x,int f)
  27. {
  28. ans[1]=ans[1]+z.query(ext)-z.query(w[x]);
  29. z.update(w[x],1);siz[x]=1;
  30. dfn[x]=++cnt;pp[cnt]=x;
  31. for(int i=head[x];i;i=e[i].nxt)
  32. {
  33. int y=e[i].to;
  34. if(y==f)continue;
  35. dfs1(y,x); siz[x]+=siz[y];
  36. } z.update(w[x],-1);
  37. }
  38. struct hjts{
  39. int sum[maxn*23],root[maxn],cnt,ls[maxn*23],rs[maxn*23];
  40. inline void update(int &rt1,int rt2,int l,int r,int pos)
  41. {
  42. rt1=++cnt; sum[rt1]=sum[rt2];
  43. ++sum[rt1]; if(l==r)return ;
  44. ls[rt1]=ls[rt2];rs[rt1]=rs[rt2];
  45. int mid=(l+r)>>1;
  46. if(pos<=mid) update(ls[rt1],ls[rt2],l,mid,pos);
  47. else update(rs[rt1],rs[rt2],mid+1,r,pos);
  48. sum[rt1]=sum[ls[rt1]]+sum[rs[rt1]];
  49. }
  50. inline int query(int rt,int rt2,int l,int r,int ll,int rr)
  51. {
  52. if(ll>rr||rt==rt2)return 0;
  53. if(l>=ll&&r<=rr) return sum[rt]-sum[rt2];
  54. int mid=(l+r)>>1,res=0;
  55. if(ll<=mid) res+=query(ls[rt],ls[rt2],l,mid,ll,rr);
  56. if(rr>mid) res+=query(rs[rt],rs[rt2],mid+1,r,ll,rr);
  57. return res;
  58. }
  59. inline int getval(int l,int r,int ll,int rr)
  60. {
  61. if(l>r||ll>rr)return 0;
  62. return query(root[r],root[l-1],1,ext,ll,rr);
  63. }
  64. }tr;
  65. inline void dfs2(int x,int f)
  66. {
  67. for(int i=head[x];i;i=e[i].nxt)
  68. {
  69. int y=e[i].to; if(y==f)continue;
  70. int tmp1=tr.getval(1,dfn[y]-1,1,w[y]-1)+tr.getval(dfn[y]+siz[y],n,1,w[y]-1);
  71. int tmp2=tr.getval(dfn[y],dfn[y]+siz[y]-1,1,w[x]-1);
  72. ans[y]=ans[x]+tmp1-tmp2; dfs2(y,x);
  73. }
  74. }
  75. signed main()
  76. {
  77. freopen("tears.in","r",stdin);
  78. freopen("tears.out","w",stdout);
  79. n=read();int q=read();
  80. for(int i=1;i<=n;i++)
  81. {
  82. w[i]=read();
  83. lsh[++ext]=w[i];
  84. }
  85. for(int i=1;i<n;i++)add(read(),read());
  86. sort(lsh+1,lsh+1+ext);
  87. ext=unique(lsh+1,lsh+1+ext)-lsh-1;
  88. for(int i=1;i<=n;i++)w[i]=lower_bound(lsh+1,lsh+1+ext,w[i])-lsh;
  89. dfs1(1,0);for(int i=1;i<=n;i++)
  90. tr.update(tr.root[i],tr.root[i-1],1,ext,w[pp[i]]);
  91. dfs2(1,0);int x; for(int i=1;i<=q;i++)
  92. x=read(),printf("%lld\n",ans[x]);
  93. }

树状数组写法:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. inline int read()
  4. {
  5. int x=0,f=1;char ch=getchar();
  6. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  8. return x*f;
  9. }
  10. const int maxn=1e6+5;
  11. struct edge{int to,nxt;}e[maxn<<1];
  12. int head[maxn],num,w[maxn],lsh[maxn],ext,n;
  13. inline void add(int x,int y)
  14. {
  15. e[++num]=(edge){y,head[x]};head[x]=num;
  16. e[++num]=(edge){x,head[y]};head[y]=num;
  17. }
  18. struct szsz{
  19. #define lowbit(x) (x&(-x))
  20. int c[maxn];
  21. inline int query(int x){int res=0;for(;x;x-=lowbit(x))res+=c[x];return res;}
  22. inline void update(int x,int val){for(;x<=ext;x+=lowbit(x))c[x]+=val;}
  23. }z;
  24. int dfn[maxn],pp[maxn],sum1[maxn],sum2[maxn],cnt,siz[maxn];
  25. long long ans[maxn];
  26. inline void dfs1(int x,int f)
  27. {
  28. z.update(w[x],1);siz[x]=1;
  29. for(int i=head[x];i;i=e[i].nxt)
  30. {
  31. int y=e[i].to;
  32. if(y==f)continue;
  33. int jb=z.query(w[x]-1);
  34. int bj=z.query(w[y]-1);
  35. dfs1(y,x);
  36. sum2[y]=z.query(w[y]-1)-bj;
  37. sum1[y]=z.query(w[x]-1)-jb;
  38. ans[1]+=sum2[y];
  39. }
  40. if(x==1)ans[1]+=z.query(w[1]-1);
  41. }
  42. inline void dfs2(int x,int f)
  43. {
  44. for(int i=head[x];i;i=e[i].nxt)
  45. {
  46. int y=e[i].to; if(y==f)continue;
  47. ans[y]=ans[x]-sum1[y]+z.query(w[y]-1)-sum2[y];
  48. dfs2(y,x);
  49. }
  50. }
  51. signed main()
  52. {
  53. freopen("tears.in","r",stdin);
  54. freopen("tears.out","w",stdout);
  55. n=read();int q=read();
  56. for(int i=1;i<=n;i++)
  57. {
  58. w[i]=read();
  59. lsh[++ext]=w[i];
  60. }
  61. for(int i=1;i<n;i++)add(read(),read());
  62. sort(lsh+1,lsh+1+ext);
  63. ext=unique(lsh+1,lsh+1+ext)-lsh-1;
  64. for(int i=1;i<=n;i++)w[i]=lower_bound(lsh+1,lsh+1+ext,w[i])-lsh;
  65. dfs1(1,0); dfs2(1,0);
  66. int x; for(int i=1;i<=q;i++)
  67. x=read(),printf("%lld\n",ans[x]);
  68. }

T3 传统异能

这个题挺不错的,由于我自己之前只会O(n)求不同子序列个数的写法,所以没有想到可以用矩阵;

先说一下n^2的做法,我们可以设dp[i][1/0] 为第i个字符选或者不选的能够构成的子序列的个数

lst[c]为c这个字符上一次出现的位置,那么转移的话就是:

  1. dp[i][1]=(dp[i-1][1]+dp[i-1][0]+1)%mod;
  2. dp[i][0]=(dp[i-1][1]+dp[i-1][0])%mod;
  3. if(lst[a[i]]) dp[i][0]=(dp[i][0]+mod-dp[lst[a[i]]][1])%mod;

当然,如果你写了这个式子之后就会很难想到正解,因为这个式子有减去的地方,会很难处理

所以我们就要用一种复杂度稍微高一些的做法来想到正解

我们设dp[i][j]为前i个字符里面,以j结尾的子序列有多少个,

那么转移的话就是

  1. if(j==s[i]) dp[i][j]=dp[i][1]+dp[i][2]+dp[i][3]+1;
  2. else dp[i][j]=dp[i-1][j];

我觉得还是比较好理解的,我们假如让所有的以c为结尾的子序列再加上一个c

那么现在以c结尾的子序列的最小长度都为2,那么再加上让以a和b结尾的子序列加一个c

就又补回来了,最后再加1表示前面一个都不被选择,只选它自己

我们发现这是一个很明显的矩形式子,因为字符集大小只有3,所以我们可以构建三个不同的矩阵

第1个矩阵大概长这个亚子

  1. 1 0 0 0
  2. 1 1 1 1
  3. 0 0 1 0
  4. 0 0 0 1

对角线显然都是1,然后第i行是1,嗯就这样

然后我们可以用线段树维护一下每个点对应的矩形,以及区间乘积是多少 相信大家都知道矩形支持交换律

查询完之后再让答案矩形乘一个这个矩阵

  1. 1 0 0 0
  2. 0 0 0 0
  3. 0 0 0 0
  4. 0 0 0 0

将第一列的加起来就是答案了

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define lid id<<1
  4. #define rid id<<1|1
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int mod=998244353;
  14. const int maxn=1e5+5;
  15. struct matrix{
  16. int mat[5][5];
  17. inline void init(){
  18. memset(mat,0,sizeof(mat));
  19. for(int i=0;i<=3;i++)mat[i][i]=1;
  20. }
  21. inline void clear(){memset(mat,0,sizeof(mat));}
  22. inline void print()
  23. {
  24. for(int i=0;i<=3;i++)
  25. {
  26. for(int j=0;j<=3;j++)
  27. cout<<mat[i][j]<<" ";
  28. cout<<endl;
  29. }
  30. }
  31. inline matrix operator*(const matrix &a)const{
  32. matrix c;c.clear();
  33. for(int i=0;i<=3;i++) for(int j=0;j<=3;j++) for(int k=0;k<=3;k++)
  34. (c.mat[i][j]=a.mat[i][k]*mat[k][j]%mod+c.mat[i][j])%=mod;
  35. return c;
  36. }
  37. }tmp[4];
  38. int n,m;
  39. inline int id(char c){return c-'A'+1;}
  40. char s[maxn];int a[maxn];
  41. matrix sum[maxn<<2];
  42. inline void init()
  43. {
  44. tmp[1].init();tmp[2].init();tmp[3].init();
  45. for(int i=1;i<=3;i++) for(int j=0;j<=3;j++)
  46. tmp[i].mat[i][j]=1;tmp[0].clear();
  47. tmp[0].mat[0][0]=1;
  48. }
  49. inline void build(int id,int l,int r)
  50. {
  51. if(l==r) return sum[id]=tmp[a[l]],void();
  52. int mid=(l+r)>>1;
  53. build(lid,l,mid);build(rid,mid+1,r);
  54. sum[id]=sum[lid]*sum[rid];
  55. }
  56. inline void update(int id,int l,int r,int pos)
  57. {
  58. if(l==r) return sum[id]=tmp[a[pos]],void();
  59. int mid=(l+r)>>1;
  60. if(pos<=mid) update(lid,l,mid,pos);
  61. else update(rid,mid+1,r,pos);
  62. sum[id]=sum[lid]*sum[rid];
  63. }
  64. inline matrix query(int id,int l,int r,int ll,int rr)
  65. {
  66. if(l>=ll&&r<=rr)return sum[id];
  67. int mid=(l+r)>>1;matrix a;a.init();
  68. if(ll<=mid) a=query(lid,l,mid,ll,rr);
  69. if(rr>mid) a=a*query(rid,mid+1,r,ll,rr);
  70. return a;
  71. }
  72. signed main()
  73. {
  74. freopen("string.in","r",stdin);
  75. freopen("string.out","w",stdout);
  76. n=read();m=read(); scanf("%s",s+1);
  77. for(int i=1;i<=n;i++) a[i]=id(s[i]);
  78. init();build(1,1,n);
  79. while(m--)
  80. {
  81. int type=read();
  82. if(type==2)
  83. {
  84. int ll=read(),rr=read();
  85. matrix ans=query(1,1,n,ll,rr);
  86. ans=tmp[0]*ans;int sum=0;
  87. sum=(ans.mat[1][0]+ans.mat[2][0]+ans.mat[3][0])%mod;
  88. printf("%lld\n",sum);
  89. }
  90. else
  91. {
  92. int pos=read();char c;cin>>c;
  93. a[pos]=id(c);update(1,1,n,pos);
  94. }
  95. }
  96. }

T4 铺设道路

我们假设第0块和第n+1块的高度为0,那么显然此时的答案不会改变

那么,我们首先可以先将其差分一下,我们将每个点的高度干到0,等价于将差分数组全部干到0

对于i>=1&&i<=n来说 我们设b[i]为d[i]-d[i-1],即差分数组

那么显然最短时间就是sigma(max(b[i],0));

对于b[l]和b[r],假设我们对l到r-1(r>l)之间施一次工,那么b[l]会-1,b[r]会+1

那么我们考虑一个贪心思想,如果我们想要总体力是最大的,那么我们应该让每个小于0的b[r]匹配的b[l]越远越好

最小的则反之,我们从1枚举每个b[i],如果b[i]>0就将其压入队列,否则就取队尾或者队首进行操作

复杂度O(n);

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0,f=1;char ch=getchar();
  7. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  9. return x*f;
  10. }
  11. const int mod=1e9+7;
  12. const int maxn=3e5+5;
  13. int n,d[maxn],b[maxn];
  14. deque<int >q;
  15. signed main()
  16. {
  17. freopen("road.in","r",stdin);
  18. freopen("road.out","w",stdout);
  19. n=read();int ans=0;
  20. for(int i=1;i<=n;i++)
  21. {
  22. d[i]=read();b[i]=d[i]-d[i-1];
  23. ans+=max(0ll,d[i]-d[i-1]);
  24. }
  25. printf("%lld\n",ans);
  26. int maxx=0,minn=0;n++;b[n]=-d[n-1];
  27. for(int i=1;i<=n;i++)
  28. {
  29. if(b[i]>0) q.push_back(i);
  30. else while(b[i])
  31. {
  32. int x=q.back();
  33. if(abs(b[i])>=abs(b[x]))
  34. {
  35. q.pop_back();
  36. (maxx+=(i-x)*(i-x)%mod*b[x]%mod)%=mod;
  37. b[i]+=b[x];b[x]=0;
  38. }
  39. else
  40. {
  41. (maxx+=(i-x)*(i-x)%mod*(-b[i])%mod)%=mod;
  42. b[x]+=b[i];b[i]=0;
  43. }
  44. }
  45. }
  46. for(int i=1;i<=n;i++) b[i]=d[i]-d[i-1];
  47. printf("%lld\n",maxx);
  48. for(int i=1;i<=n;i++)
  49. {
  50. if(b[i]>0) q.push_back(i);
  51. else while(b[i])
  52. {
  53. int x=q.front();
  54. if(abs(b[i])>=abs(b[x]))
  55. {
  56. q.pop_front();
  57. (minn+=(i-x)*(i-x)%mod*b[x]%mod)%=mod;
  58. b[i]+=b[x];b[x]=0;
  59. }
  60. else
  61. {
  62. (minn+=(i-x)*(i-x)%mod*(-b[i])%mod)%=mod;
  63. b[x]+=b[i];b[i]=0;
  64. }
  65. }
  66. }
  67. printf("%lld\n",minn);
  68. }

总结::

距离noip2021不远了,csp的失利一直缠绕再我心头,不过我是不会放弃的,加油吧JYF!!!!!!!

冲刺noip2021模拟16的更多相关文章

  1. 2021.10.26考试总结[冲刺NOIP模拟16]

    T1 树上的数 \(DFS\)一遍.结构体存边好像更快? \(code:\) T1 #include<bits/stdc++.h> using namespace std; namespa ...

  2. 【CJOJ P1957】【NOIP2010冲刺十模拟赛】数字积木

    [NOIP2010冲刺十模拟赛]数字积木 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢? 你的任务就是读入n个 ...

  3. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  4. 冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱

    1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a ...

  5. 冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱

    1.二叉树(binary) .二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结 ...

  6. 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱

    题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...

  7. 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

    题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...

  8. 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱

    题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...

  9. 7.15考试总结(NOIP模拟16)[Star Way To Heaven·God Knows·Lost My Music]

    败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理 ...

随机推荐

  1. Tensorflow保存神经网络参数有妙招:Saver和Restore

    摘要:这篇文章将讲解TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的神经网络. 本文分享自华为云社区<[Python人工智能] 十一. ...

  2. redis的集群安装

    1.创建安装目录 在master ,node1 ,node2中分别创建 mkdir /usr/local/soft/redis-cluster 2.将redis 复制到redis-cluster 目录 ...

  3. CodeForce-785B Anton and Classes(简单贪心)

    Anton and Classes Anton likes to play chess. Also he likes to do programming. No wonder that he deci ...

  4. python matplotlib.pyplot 条形图详解

    python matplotlib.pyplot 条形图详解 一.创建直方图 可以用bar函数来创建直方图 然后用show函数显示直方图 比如: import matplotlib.pyplot as ...

  5. Django学习day01随堂笔记

    每日测验 """ 每日测验 1.你所知道的前端框架和实用插件有哪些,他们各有什么特点 2.使用bootstrap需要注意什么,常用的bootstrap样式有哪些 &quo ...

  6. dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标

    大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...

  7. Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】

    正题 题目链接:https://loj.ac/p/2769 题目大意 给出\(n\)个点\(m\)条地铁线路,每条线路是一条路径. 求\(1\)到\(n\)的最短路且在最短路径的情况下相邻换乘点的距离 ...

  8. nginx默认端口80被系统占用解决办法

    1.输入netstat -aon|findstr "80"查看端口占用情况 (ano 和aon好像是一样的) 上面可看到是pid值(进程ID)为4 2.输入tasklist|fin ...

  9. Jenkins持续集成与部署

    一.Jenkins简介 在阅读此文章之前,你需要对Linux.Docker.Git有一定的了解和使用,如果还未学习,请阅读我前面发布的相关文章进行学习. 1.概念了解:CI/CD模型 CI全名Cont ...

  10. Dart 中的final 和 const

    Dart 常量和常量值 final 和 const 两个关键字用来定义常量,有什么区别呢? final 声明的是运行时常量,const声明的是编译时常量 const 可以声明常量值 举个例子: imp ...