补题进度:8/10

A(组合计数)

题意:

  一个人站在数轴原点,每秒有1/4概率向前走一步,1/4概率向后走一步,1/2概率不动,问t秒后在p位置的概率。

  t,p<=100000

分析:

  枚举不动的个数,于是向前走的个数和向后走的个数都确定了,然后就可组合计数了。

B(平面图k小割)

题意:

  给出一个n个点的树,1是根节点,每个点有点权,输出前k小的包含1节点的连通块的权值。

  n<=10^5,k<=10^5,点权<=10^9

分析:

  连通块不好处理,一个连通块实际上对于一个割集,我们可以这样转化:

  把1当作源点,建一个汇点,把每个叶子向汇点连边,然后树上每条边的边权表示其子树里的点权和,那么这样一个割就对应了包含S点的一个连通块的点权和,所以问题就变成了求该图的k大割

  求k大割是没法求的,但注意到该问题是平面图,所以可以建出对偶图跑k短路。

  对于k短路,可以用可持久化堆来实现。

  1. /*
  2. 可持久化堆优化k短路
  3. 求最短路径树:O(nlogn)
  4. 求k短路:O(mlogm+klogk)
  5. 空间复杂度:O(mlogm),但具体开数组要注意常数,要看执行merge操作的次数
  6. */
  7. #include<bits/stdc++.h>
  8. using namespace std;
  9. const int maxn=,maxm=,maxsize=;//maxsize是堆的最大个数
  10. const long long inf=1000000000000000LL;
  11. int a[maxn+];
  12. long long s[maxn+];
  13. int n,k,m,len,tot;
  14. int S,T;
  15. vector<int> g1[maxn+];
  16. int mi[maxn+],mx[maxn+];
  17. int head[maxn+],nx[maxm+];
  18. long long dis[maxn+];
  19. int pos[maxn+],rt[maxn+];
  20. struct Edge
  21. {
  22. int to;
  23. long long w;
  24. }e[maxm+];
  25. struct node
  26. {
  27. /*
  28. u是当前堆顶的节点编号
  29. key是当前堆顶对应边的权值,边的权值定义为:走这条边要多绕多少路
  30. l,r分别是堆左右儿子的地址
  31. */
  32. int u;
  33. long long key;
  34. int l,r;
  35. }H[maxsize+];
  36. struct heapnode
  37. {
  38. /*
  39. 求k短路时候用到的数据结构
  40. len表示1~倒数第二条边的边权和
  41. root表示倒数第二条边的tail的H[tail],其中堆顶就是最后一条边
  42. */
  43. long long len;
  44. int root;
  45. bool operator < (const heapnode& x) const
  46. {
  47. return len+H[root].key>x.len+H[x.root].key;
  48. }
  49. };
  50. priority_queue<heapnode> q;
  51. void addedge(int u,int v,long long w)
  52. {
  53.  
  54. //printf("%d %d %lld\n",u,v,w);
  55. e[++len]={v,w};
  56. nx[len]=head[u];
  57. head[u]=len;
  58. }
  59. void dfs(int k,int fa)
  60. {
  61. s[k]=a[k];
  62. bool flag=;
  63. mi[k]=n+;
  64. mx[k]=;
  65. for(int i=;i<g1[k].size();++i)
  66. if(g1[k][i]!=fa)
  67. {
  68. flag=;
  69. dfs(g1[k][i],k);
  70. s[k]+=s[g1[k][i]];
  71. mi[k]=min(mi[k],mi[g1[k][i]]);
  72. mx[k]=max(mx[k],mx[g1[k][i]]);
  73. }
  74. if(!flag) mi[k]=mx[k]=++m;
  75. }
  76. int newnode(int u,long long key)
  77. {
  78. ++tot;
  79. H[tot]={u,key,,};
  80. return tot;
  81. }
  82. int merge(int u,int v)
  83. {
  84. /*
  85. merge两个堆u和v
  86. 这里是采用随机堆,方便合并,方便持久化
  87. */
  88. if(!u) return v;
  89. if(!v) return u;
  90. if(H[v].key<H[u].key) swap(u,v);
  91. int k=++tot;
  92. H[k]=H[u];
  93. if(rand()%) H[k].l=merge(H[k].l,v);
  94. else H[k].r=merge(H[k].r,v);
  95. return k;
  96. }
  97. void Kshort()
  98. {
  99. /*
  100. 求k短路
  101. */
  102. dis[T]=;
  103. for(int i=;i<T;++i) dis[i]=inf;
  104. tot=;
  105. for(int i=m-;i>=;--i)
  106. {
  107. /*
  108. DAG图求最短路径树
  109. */
  110. int fa=;
  111. for(int j=head[i];j!=-;j=nx[j])
  112. if(dis[i]>e[j].w+dis[e[j].to])
  113. {
  114. dis[i]=e[j].w+dis[e[j].to];
  115. pos[i]=j;
  116. fa=e[j].to;
  117. }
  118. rt[i]=rt[fa];
  119. for(int j=head[i];j!=-;j=nx[j])
  120. if(j!=pos[i])
  121. {
  122. //printf("ce : %d %d\n",i,e[j].to);
  123. rt[i]=merge(rt[i],newnode(e[j].to,e[j].w+dis[e[j].to]-dis[i]));
  124. }
  125. }
  126. //printf("tot : %d\n",tot);
  127. //printf("len : %d\n",len);
  128. //printf("m : %d\n",m);
  129. //for(int i=0;i<=T;++i) printf("%d : %lld %d\n",i,dis[i],pos[i]);
  130. printf("%lld\n",dis[S]+s[]);
  131. heapnode now={0LL,rt[S]};
  132. if(now.root) q.push(now);
  133. while(--k&&!q.empty())
  134. {
  135. /*
  136. 每次从优先队列队首取出最小的边集
  137. 每个边集对对应一种合法的k短路走法
  138. 有两种扩展方法
  139. 第一种:将最后一条边换成所在堆的次小元素(相当于从堆里把堆顶删除)
  140. 第二种:新加一条边,即从最后一条边继续往后走
  141. */
  142. now=q.top();
  143. q.pop();
  144. printf("%lld\n",now.len+H[now.root].key+dis[S]+s[]);
  145. int id=merge(H[now.root].l,H[now.root].r);
  146. //printf("%d : %d %lld\n",id,H[id].u,H[id].key);
  147. if(id)
  148. q.push({now.len,id});
  149. now.len+=H[now.root].key;
  150. if(rt[H[now.root].u])
  151. q.push({now.len,rt[H[now.root].u]});
  152. }
  153. }
  154. int main()
  155. {
  156. srand(time());
  157. scanf("%d%d",&n,&k);
  158. for(int i=;i<=n;++i) scanf("%d",&a[i]);
  159. for(int i=;i<n;++i)
  160. {
  161. int u,v;
  162. scanf("%d%d",&u,&v);
  163. g1[u].push_back(v);
  164. g1[v].push_back(u);
  165. }
  166. dfs(,);
  167. for(int i=;i<=n+;++i) head[i]=-;
  168. for(int i=;i<=n;++i) addedge(mi[i]-,mx[i],-s[i]);
  169. for(int i=;i<m;++i) addedge(i,i+,);
  170. S=,T=m;
  171. Kshort();
  172. return ;
  173. }

C(随机算法)

题意:

  给出一个n个点的树,每个点有自己的颜色,选出一个包含点数最少的连通块,使得其中有k种不同的颜色。

  n<=10000,k<=5,每个点颜色<=n

分析:

  如果每个点的颜色是1~5,那就很好办了,我们只需要做树形dp就可以了,dp[i][j]表示以i为根的子树,颜色包含情况为j的最少点数

  那么这个dp就是n*4^5的

  但现在颜色数量有很多,无法表示状态

  考虑随机算法,我们将1~n颜色随机映射到1~k,我们来分析下正确的概率:

  分母很明显是$k^n$

  成功当且仅当作为答案的那一组颜色被染成了k种不同的颜色,所以分子就是$k!*k^{n-k}$

  所以成功的概率是$\frac{k^n}{k!*k^{n-k}} = 0.2$

  于是随个30次就行了

D(递推)

题意:

  k-left tree指的是一类树,需要满足两个性质:

    1、从根向每个叶子走的过程中经过的左孩子的个数<k

    2、除叶子节点外的其它节点都有2个孩子

  求n个叶子节点的k-left tree有多少种

  n,k<=5000

分析:

  一个k-left tree的左子树一定是k-1 left tree 右子树一定是k left tree树,只需要枚举左右两边分配的叶子节点个数就行了,O(n^3)的算法是显然的。

  我们通过O(n^3)的算法算出了所有的ans[1..n][1..k],已经不能再优化了,但该题只需要求固定k下的ans[1..n],所以我们只能换思路用O(n^2)的去解决。

  考虑已经知道了k限制下,有n个节点的所有树,如何更新到n+1的答案

  我们发现该树有n个叶子说明有n-1个非叶子,我们只需要去考虑这些非叶子的形状就行了

  从n更新到n+1实际上给n对应的树里面添加一个树枝,但为了不重复计数,我们人为规定该树枝只能添加到先序遍历最后的位置(如果在中间添加,可以看成删去最后的那个树枝,保留目前这个树枝,将这个树作为n的答案)

  于是dp[i][j]表示i个树枝,从根到最后一个树枝经过了j个左儿子的树的总数,那么显然对于i+1,我们可以在这j个左儿子那添加一条向右的树枝,所以可以转移到dp[i+1][j+1],dp[i+1][j],....,dp[i+1][1],前缀和优化即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=,Mod=1e9+;
  4. int k,n,f[N][N];
  5. void inc(int &x,long long y)
  6. {
  7. x=(x+y+Mod)%Mod;
  8. }
  9. int main()
  10. {
  11.  
  12. cin>>k>>n;
  13. /*for(int i=2;i<=k;++i) f[1][i]=1;
  14. for(int j=3;j<=k;++j)
  15. for(int i=1;i<=n;++i)
  16. for(int l=1;l<i;++l)
  17. inc(f[i][j],1LL*f[l][j-1]*f[i-l][j]%Mod);*/
  18. /*for(int j=1;j<=k;++j)
  19. for(int i=1;i<=n;++i)
  20. printf("%d %d : %d\n",i,j,f[i][j]);*/
  21. k-=;
  22. f[][]=;
  23. f[][]=;
  24. for(int i=;i<n;++i)
  25. {
  26. for(int j=;j<=k;++j)
  27. inc(f[i+][min(j+,k)],f[i][j]);
  28. for(int j=k-;j>=;--j) inc(f[i+][j],f[i+][j+]);
  29. }
  30. for(int i=;i<=n;i++)
  31. {
  32. int ans=;
  33. for(int j=;j<=k;++j) inc(ans,f[i][j]);
  34. printf("%d\n",ans);
  35. }
  36. return ;
  37. }

E(找规律)

F(Fibonacci树递推)

题意:

  问深度为n的fibonacci树的白点距离情况,即相距1,2,...,,2*n的白点对分别有多少对。

  n<=5000

  fibonacci树指的是根是白点,一个白点下面一个黑点,一个黑点下面一个白点和一个黑点形成的树。

分析:

  fibonacci树有这样的性质:每个深度的点的个数、每个深度的黑点个数、每个深度的白点个数分别都是fibonacci数列

  dp[i][0/1]表示深度为i的fibonacci树,根节点是白/黑点情况下的白色点对相距情况(保存的是1~2*i的数组)

  很明显dp[i][0]=dp[i-1][1],dp[i][1]=dp[i-1][0]+dp[i-1][1]+两个子树之间贡献的答案

  两个子树之间的贡献的答案就是两个fibonacci的卷积,所以这样是O(n^3)

  如果卷积用FFT,那么是O(n^2logn)也是不能通过的

  实际上两个fibonacci的卷积可以这样做:

  我们枚举a的下标j,然后将a[j]*b[1,2,...,i-1]放到对应的ans[j+1,j+2,...,j+i-1]位置上,问题就变成了给区间加上一个fibonacci数列,最终求区间的每一个位置的数字

  这我们可以用类似差分的做法来O(1)修改,O(n)询问

  所以时间复杂度就是降到O(n^2),但是常数有点大,大概是std的1.5倍,在某oj上不能通过。

G(可持久化线段树优化建边)

题意:

  有n个人,每个人三个属性a,b,c,若一个人的某两项属性大于另外一个人的对应两项属性,那么这个人可以击败另一个人。问有多少个人可以击败其它所有人。

  n<=100000

分析:

  如果n比较小,那么就暴力建图然后缩点就行了。

  这里需要用数据结构优化建边。

  对于三个属性,我们每次提取两维考虑,假设这两维是x,y

  按照x从小到大排序,然后从左往右扫,假设现在来到了第i个人,那么连边就是“向1~i-1个人中y属性小于自己的人建边”

  如果只有“向y属性小于自己的人建边”,那么建一个权值线段树,把每个线段树节点作为辅助节点就行了

  现在有了“向1~i-1个人中”这个限制,那也很简单,我们建可持久化线段树就行了

  建可持久化线段树唯一注意的是,新点u向旧点u也要连一条边

  这样边数就从O(n^2)下降到了O(nlogn),点数从O(n)上升到了O(nlogn)

  然后缩点,问题变成了有一个DAG图,有一些关键节点(1~n),我们想知道这关键节点当中有哪些点可以到达其它关键节点

  我们只需要对这个DAG图把所有非关键节点都拓扑掉,剩下关键节点就被剥出来了,若关键节点是唯一入度为0的节点,那么该关键节点对应强连通分量里面的所有原来的节点答案就是1,其它答案是0。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=,maxsize=**,maxm=*maxsize;
  4. int a[maxn+],b[maxn+],c[maxn+],id[maxn+];
  5. int rt[maxn+];
  6. int n,tot,num,sz,len;
  7. int head[maxsize+],head1[maxsize+];
  8. int nx[maxm+],e[maxm+];
  9. int t[maxsize+],color[maxsize+];
  10. bool v[maxsize+];
  11. int ans[maxsize+],d[maxsize+];
  12. struct tree
  13. {
  14. int lc,rc;
  15. }T[maxsize+];
  16. void addedge(int u,int v)
  17. {
  18. if(!u||!v) return;
  19. //printf("%d %d\n",u,v);
  20. ++len;
  21. e[len]=v;
  22. nx[len]=head[u];
  23. head[u]=len;
  24. ++len;
  25. e[len]=u;
  26. nx[len]=head1[v];
  27. head1[v]=len;
  28. }
  29. void adde(int u,int v)
  30. {
  31. ++len;
  32. e[len]=v;
  33. nx[len]=head1[u];
  34. head1[u]=len;
  35. }
  36. int build(int last,int l,int r,int x,int id)
  37. {
  38. int k=++tot;
  39. T[k]=T[last];
  40. addedge(k,last);
  41. if(l==r)
  42. {
  43. addedge(k,id);
  44. return k;
  45. }
  46. int mid=(l+r)>>;
  47. if(x<=mid) T[k].lc=build(T[last].lc,l,mid,x,id),addedge(k,T[k].lc);
  48. else T[k].rc=build(T[last].rc,mid+,r,x,id),addedge(k,T[k].rc);
  49. return k;
  50. }
  51. void add(int k,int l,int r,int x,int id)
  52. {
  53. if(!k) return;
  54. if(l==r)
  55. {
  56. addedge(id,k);
  57. return;
  58. }
  59. int mid=(l+r)>>;
  60. if(x<=mid) add(T[k].lc,l,mid,x,id);
  61. else addedge(id,T[k].lc),add(T[k].rc,mid+,r,x,id);
  62. }
  63. void work(int *x,int *y)
  64. {
  65. for(int i=;i<=n;++i) id[x[i]]=i;
  66. for(int i=;i<=n;++i)
  67. {
  68. rt[i]=build(rt[i-],,n,y[id[i]],id[i]);
  69. add(rt[i],,n,y[id[i]],id[i]);
  70. }
  71. }
  72. void dfs(int k)
  73. {
  74. v[k]=;
  75. for(int i=head[k];i!=-;i=nx[i])
  76. if(!v[e[i]]) dfs(e[i]);
  77. ++sz;
  78. t[sz]=k;
  79. }
  80. void dfs1(int k)
  81. {
  82. v[k]=;
  83. color[k]=num;
  84. for(int i=head1[k];i!=-;i=nx[i])
  85. if(!v[e[i]]) dfs1(e[i]);
  86. }
  87. queue<int> q;
  88. int main()
  89. {
  90. int size = << ; // 256MB
  91. char *p = (char*)malloc(size) + size;
  92. __asm__("movl %0, %%esp\n" :: "r"(p));
  93. scanf("%d",&n);
  94. for(int i=;i<=n;++i) scanf("%d%d%d",&a[i],&b[i],&c[i]);
  95. for(int i=;i<=maxsize;++i) head[i]=head1[i]=-;
  96. tot=n;
  97. work(a,b);
  98. //printf("%d %d\n",tot,len);
  99. work(a,c);
  100. //printf("%d %d\n",tot,len);
  101. work(b,c);
  102. //printf("%d %d\n",tot,len);
  103. for(int i=;i<=tot;++i) if(!v[i]) dfs(i);
  104. memset(v,,sizeof(v));
  105. for(int i=sz;i>=;--i) if(!v[t[i]]) ++num,dfs1(t[i]);
  106. memset(v,,sizeof(v));
  107. for(int i=;i<=n;++i)
  108. v[color[i]]=;
  109. for(int i=;i<=num;++i) head1[i]=-;
  110. for(int i=;i<=tot;++i)
  111. for(int j=head[i];j!=-;j=nx[j])
  112. {
  113. int u=color[i],vv=color[e[j]];
  114. if(u==vv) continue;
  115. ++d[vv];
  116. adde(u,vv);
  117. //printf("ok : %d\n",color[vv]);
  118. }
  119. for(int i=;i<=num;++i)
  120. if(!d[i]&&!v[i]) q.push(i);
  121. while(!q.empty())
  122. {
  123. int u=q.front();
  124. q.pop();
  125. for(int i=head1[u];i!=-;i=nx[i])
  126. {
  127. int to=e[i];
  128. --d[to];
  129. if(d[to]==&&!v[to]) q.push(to);
  130. }
  131. }
  132. //printf("num : %d\n",num);
  133. //for(int i=1;i<=n;++i) printf("%d : %d\n",i,color[i]);
  134. int sum=;
  135. int winner=;
  136. for(int i=;i<=num;++i)
  137. if(v[i]&&d[i]==) ++sum,winner=i;
  138. if(sum==)
  139. for(int i=;i<=n;++i)
  140. if(color[i]==winner) ans[i]=;
  141. for(int i=;i<=n;++i) printf("%d\n",ans[i]);
  142. //cout<<clock();
  143. return ;
  144. }

H(贪心+set)

题意:

  你有n个商品,Alice买第i件商品花ai元,Bob买第i件商品花bi元,一个商品只有一个,显然一个商品不能被两人同时买,Alice可以最多买A个,Bob可以最多买B个,问他们该如何买,你才能获得最大的收益。

  A+B<=n<=10^5

  ai,bi可正可负

分析:

  我们先把所有负权值修改为0,那么“最多买”就变成了“恰好买”

  我们按照ai从大到小排个序,首先Alice买前A个,Bob买后n-A个中bi最大的B个

  然后我们去枚举Alice买的最后一个商品i,那么1~i每个商品都被Alice或者Bob买了,不会有商品没有被买(假如这样,那么Alice去买那个没人买的一定比买现在的第i个要来的划算)

  很显然这样的答案就是1~i里面a[i]的和加上i-A个最大的b[i]-a[i]的和(即i个商品里面Alice买A个,Bob买i-A个,Bob买的这i-A个一定是b[i]-a[i]最大的i-A个),然后Bob还可以买B-(i-A)个,就是从i+1~n里面挑b[i]最大的B-(i-A)个买,这个显然可以用两个平衡树去维护

  但当然因为个数恰好是递增、递减的,所以我们也可以在i递增的过程中用两个set来维护

  时间复杂度O(nlogn)

I(推导+容斥计算)

待填坑

K(推导+杜教筛)

待填坑

寒武纪camp Day1的更多相关文章

  1. 寒武纪camp网络测试赛

    寒武纪camp网络测试赛 地址:oj点我进入 A(树形dp+树链剖分) 题意: 分析: 考虑树形dp,f0(x)和f1(x)分别表示以x为根的子树,不取x点或取x点的最大合法子集的元素个数 那么对于一 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...

    Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...

  4. CCPC-Wannafly Winter Camp Day1部分题目解析

    Preface 最近恰好不知道做什么题,所以就按老叶要求做上面的比赛. 稍微看了下感觉难度适中,大部分题目偏向联赛难度,当然也有些题目打到了省选题的感觉(基本都是Div1的题) 这里就简单拿一些我做得 ...

  5. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A B C E F I J

    A 机器人 链接:https://www.cometoj.com/contest/7/problem/A?problem_id=92 思路: 分两大类讨论: 1. B区没有点: (1)点都在起点左边 ...

  6. 牛客国庆训练,CCPC Camp DAY1 J 倍增,括号匹配

    https://www.nowcoder.com/acm/contest/201#question 题意:中文不翻译了 解法的个人理解: 对于一个合法的区间$[L,R]$ 1.显然其左括号的匹配位置都 ...

  7. CCPC-Wannafly Winter Camp Day1 Div1 - 爬爬爬山 - [最短路][堆优化dijkstra]

    题目链接:https://zhixincode.com/contest/3/problem/F?problem_id=39 样例输入 1  4 5 1 1 2 3 4 1 2 1 1 3 1 1 4 ...

  8. CCPC-Wannafly Winter Camp Day1 Div1 - 夺宝奇兵 - [贪心+线段树]

    题目链接:https://zhixincode.com/contest/3/problem/J?problem_id=43 样例输入 1 4 1110 11 110 21 210 31 315 415 ...

  9. CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    Replay Dup4: 要是不挂机,再多仔细想想就好了 J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵? 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道 要发 ...

随机推荐

  1. COGS 942. [東方S3] 比那名居天子

    Problem 1 比那名居天子(tenshi.cpp/c/pas) 题目描述 在幻想乡,比那名居天子是管理着『要石』的天人.『要石』是能够引发和镇压地震的存在,当然也可以用来改变地形.因为在幻想乡引 ...

  2. java生成饼图svg

    package com.tellhow.svg; import java.io.File;import java.io.FileOutputStream; /** *  * @author 风絮NO. ...

  3. es6 fs 输出文件 iviewDemo

    // fs.open('./env.js', 'w', function(err, fd) { // // const buf = 'export default "development& ...

  4. C-基础:memcpy、memset、memmove、memcmp、memchr

    一,原型 void * memcpy ( void * destination, const void * source, size_t num ); 功能:将以source作为起始地址的数据复制nu ...

  5. day13 函数模块之序列化 random 模块 os模块 sys模块 hashlib模块 collections模块

    json import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 ...

  6. 2011 luogu P1311 选择客栈

    题目描述 丽江河边有 nn 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...

  7. Shell流程语句

    1. shell流程控制 流程控制是改变程序运行顺序的指令.linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case). 2. if ...

  8. perl学习之:use and require

    本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域 ...

  9. configparser ,subprocess , xlrd ,xlwt 模块

    一,configparser模块 ''' configparser模块: 是什么: 用于解析配置文件的模块 配置文件的定义: 用于编写保存某个软件或某个系统的一系列参数的文件 设置参数 为什么需要配置 ...

  10. AnjularJs-Select添加数据并设置默认值

    html中 <select name="book_classify" class="all_list_btn" ng-model="select ...