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. Ubuntu / CoreOS修改DNS配置

    不要直接手动修改文件 /etc/resolv.conf 安装好Ubuntu之后设置了静态IP地址,再重启后就无法解析域名.想重新设置一下DNS,打开/etc/resolv.conf cat /etc/ ...

  2. javaScript对象——function对象

    1.基本对象和Function(函数)方法对象 2.概念 3.创建function对象的三种方式: 第一种不建议使用 2.3两种方式就是方法名位置不同,建议使用: 4.方法调用只要名字对,实参不一定完 ...

  3. MySQL高级语句(一)

    一.MySQL高级进阶SQL 语句 1.SELECT 2.DISTINCT 3.WHERE  4.AND.OR 5.IN 6.BETWEEN 7.通配符.LIKE 8.ORDER BY 9.| | 连 ...

  4. 迷你商城后台管理系统---------stage3项目部署测试汇总

    系统测试 在项目部署到云服务器之前,已通过本机启动springboot程序,访问localhost:8080,输入登陆的账户等一系列操作测试:功能测试.健壮性测试,系统已满足用户规定的需求. 系统部署 ...

  5. webpack4. 使用autoprefixer 无效

    解决办法: 在package.json文件中加上这个 "browserslist": [ "defaults", "not ie < 11&qu ...

  6. ecshop transport.js IE报错(608行),对象不支持此属性或方法 的解决办法

    解决办法: 将if (this.hasOwnProperty(k)) { 改为: if (this.hasOwnProperty && this.hasOwnProperty(k)) ...

  7. Xftp乱码问题

    Xftp出现乱码 修改编码

  8. DevOps与CICD简介

    整体知识点 ·Devops与CI/CD简介 ·Gitlab安装与Git命令使用 ·Gitlab实现持续集成 ·Gitlab实现分支管理 ·Jenkins简介及安装 ·Jenkins插件管理及基础配置 ...

  9. centos 7 & 6 优化脚本

    简单优化 ,未涉及安全优化,如有需求请自行修改脚本实现 1 #!/bin/bash 2 SysVer=`cat /etc/redhat-release | awk -F'release' '{prin ...

  10. 软件开发的V模型

    原文来自:http://www.51testing.com/html/67/n-3723567.html 软件开发的V模型大家都不陌生,其中测试阶段分为单元测试->功能测试->系统测试-& ...