cbh大爷说:写博客不能弃坑。

orz cbh

那我就来更新博客了。

violet这个系列的题好神啊……出题人好劲啊……

……怎么最近都在理性愉悦啊……

另外bzoj400题纪念~

2708: [Violet 1]木偶

首先先对所有木偶按照特征值排序

考虑一种木偶与绳索配对的方法:

木偶\(1\)与绳索\(k+1\)配对,木偶\(2\)与绳索\(k+2\)配对……木偶\(n-k\)与绳索\(n\)配对。

当木偶\(n-k+1\)无法与绳索\(k\)配对时,这样的配对方法能扔掉\(k\)个木偶。

容易证明,最优的配对方式一定可以分成许多段,每段内用这种方式进行配对。

于是可以dp。

首先令\(g_{l,r}\)表示l~r之间用那种方式配对最多能扔掉多少个木偶,\(g_{l,r}\)可以通过枚举\(k\)算出,时间复杂度\(O(n^3)\)

令\(f_i\)表示到1~i之间能扔掉多少个木偶,那么有\(f_i=max\left \{ f_j+g_{j+1,i} \right \}\)。直接dp,时间复杂度\(O(n^2)\)

时间复杂度为\(O(n^2)\)

  1. #include <bits/stdc++.h>
  2. #define N 100
  3. using namespace std;
  4. int n;
  5. int f[N], ai[N];
  6. int g[N][N];
  7. int main()
  8. {
  9. while (scanf("%d", &n) !=EOF)
  10. {
  11. for (int i = ; i <= n; ++ i) scanf("%d", &ai[i]);
  12. sort(ai + , ai + n + );
  13. for (int i = ; i <= n; ++ i)
  14. for (int j = i; j <= n; ++ j)
  15. {
  16. int bo = ;
  17. for (int k = ; k <= j - i + ; ++ k)
  18. {
  19. int p, q;
  20. for (p = i, q = i + k; q <= j; ++ p, ++ q)
  21. if (ai[q] - ai[p] > ) bo = ;
  22. if (abs(ai[p] - ai[i + k - ]) <= ) bo = ;
  23. if (!bo) {g[i][j] = k - ; break;}
  24. }
  25. if (bo) g[i][j] = j - i + ;
  26. //if (g[i][j] != cal(i, j))
  27. // puts("haha");
  28. }
  29. for (int i = ; i <= n; ++ i) f[i] = ;
  30. for (int i = ; i <= n; ++ i)
  31. for (int j = ; j < i; ++ j)
  32. f[i] = max(f[i], f[j] + g[j + ][i]);
  33. printf("%d\n", f[n]);
  34. }
  35. }

2709: [Violet 1]迷宫花园

二分答案,判断最短路,期间因为eps的问题wa了许多发QAQ

时间复杂度\(O(RClogRClogv)\)

  1. #include <bits/stdc++.h>
  2. #define INF 1000000000
  3. using namespace std;
  4. int r, c;
  5. double ll;
  6. char mp[][];
  7. int get(int rr, int cc)
  8. {
  9. return (rr - ) * c + cc;
  10. }
  11. int dr[] = {, -, , }, dc[] = {, , , -};
  12. vector <int> bi[];
  13. vector <double> ci[];
  14. int s, e;
  15. void build(int a, int b, double c)
  16. {
  17. bi[a].push_back(b); ci[a].push_back(c);
  18. bi[b].push_back(a); ci[b].push_back(c);
  19. }
  20. struct node
  21. {
  22. int t; double l;
  23. };
  24. bool operator < (node a, node b) {return a.l > b.l;}
  25. priority_queue <node> H;
  26. int vis[]; double dis[];
  27. int main()
  28. {
  29. int T;
  30. cin >> T;
  31. while (T --)
  32. {
  33. cin >> ll >> r >> c;
  34. for (int i = ; i <= r; i++)
  35. {
  36. char cc;
  37. scanf("%c", &cc);
  38. while (cc != '\n') scanf("%c", &cc);
  39. for (int j = ; j <= c; j++)
  40. {
  41. scanf("%c", &cc);
  42. while (cc == '\n') scanf("%c",&cc);
  43. mp[i][j] = cc;
  44. if (cc=='S') s = get(i, j);
  45. if (cc=='E') e = get(i, j);
  46. }
  47. }
  48. {
  49. double lb = , rb = ;
  50. while (rb - lb > 0.0000001)
  51. {
  52. double md = (lb + rb) / ;
  53. for (int i = ; i <= r * c; ++ i) bi[i].clear(), ci[i].clear();
  54. for (int i = ; i <= r; ++ i)
  55. for (int j = ; j <= c; ++ j)
  56. for (int d = ; d < ; ++ d)
  57. if (mp[i][j] != '#' && mp[i + dr[d]][j + dc[d]] != '#')
  58. build(get(i, j), get(i + dr[d], j + dc[d]), (d >= ? : md));
  59. for (int i = ; i <= r * c; ++ i)
  60. dis[i] = INF, vis[i] = ;
  61. while (!H.empty()) H.pop();
  62. dis[s] = ,
  63. H.push((node){s, });
  64. while (!H.empty())
  65. {
  66. int hd;
  67. do hd = H.top().t, H.pop();
  68. while (vis[hd] && !H.empty());
  69. if (!vis[hd]) vis[hd] = ;
  70. else break;
  71. for (int i = ; i < bi[hd].size(); ++ i)
  72. if (dis[hd] + ci[hd][i] < dis[bi[hd][i]])
  73. {
  74. dis[bi[hd][i]] = dis[hd] + ci[hd][i];
  75. H.push((node){bi[hd][i], dis[bi[hd][i]]});
  76. }
  77. }
  78. if (dis[e] > ll) rb = md;
  79. else lb = md;
  80. }
  81. printf("%.5lf\n", lb);
  82. }
  83.  
  84. }
  85. }

2710: [Violet 1]追风者

好神的题啊,我不会做QAQ

2711: [Violet 2]After 17

题目要求最小化\(\sum_{i=1}^{n}\sum_{j=i+1}^{n}x_i x_j + y_i y_j\),于是\(x\)和\(y\)可以分别考虑。

\(\sum_{i=1}^{n}\sum_{j=i+1}^{n}x_i x_j = \frac{(\sum_{i=1}^{n}x_i)^2-\sum_{i=1}^{n}x_i^2}{2}\)

通过归纳法(?)可以证明当\(\sum abs(x_i)\)最大时最优。因此\(\sum_{i=1}^{n}x_i)^2\)是定值,于是就可以用dp去求\(\sum_{i=1}^{n}x_i^2\)的最大值。

时间复杂度\(O(nl)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 210
  4. #define M 40010
  5. int f[N][M * ];
  6. int n;
  7. int xi[N], yi[N];
  8. double ans;
  9. void solve(int d[])
  10. {
  11. for (int i = ; i <= n; ++ i)
  12. for (int j = -M; j < M; ++ j)
  13. f[i][j + M] = ;
  14. f[][M] = ;
  15. for (int i = ; i < n; ++ i)
  16. for (int j = -M; j < M; ++ j)
  17. if (f[i][j + M])
  18. f[i + ][j + d[i + ] + M] = f[i + ][j - d[i + ] + M] = ;
  19. for (int i = ; i < M; ++ i)
  20. if (f[n][M + i] || f[n][M - i])
  21. {
  22. ans += pow(i, );
  23. break;
  24. }
  25. }
  26. int main()
  27. {
  28. scanf("%d", &n);
  29. for (int i = ; i <= n; ++ i)
  30. {
  31. scanf("%d%d", &xi[i], &yi[i]);
  32. ans -= pow(xi[i], ) + pow(yi[i], );
  33. }
  34. solve(xi);
  35. solve(yi);
  36. printf("%.2lf", ans / );
  37. }

2712: [Violet 2]棒球

第二道神题啊QAQ

考虑将边界化成分数,为什么要化成分数呢?因为精度问题。

化成分数后就转成了这么个问题:求分数\(\frac{p}{q}\),最小化\(p\),\(q\),使得\(\frac{lp}{lq} < \frac{p}{q} \leq  \frac{rp}{rq}\)

若\(\frac{p}{q} = \frac{rp}{rq}\),那么\(q=\frac{rq}{gcd(rp, rq)}\)。

剩下得就是\(\frac{lp}{lq} < \frac{p}{q} < \frac{rp}{rq}\)

考虑如下做法

  若有一个整数\(p\)满足\(\frac{lp}{lq} < p < \frac{rp}{rq}\),那么就输出\(p\)

  如果\(lp<lq\)且\(rp<rq\),则去递归求\(\frac{rq}{rp} < \frac{p'}{q'} < \frac{lq}{lp}\),那么原问题得解就是\(\frac{q'}{p'}\)

  否则,令\(k=\left \lfloor \frac{lp}{lq} \right \rfloor\),递归求\(\frac{rq - k * rp}{rp} < \frac{p'}{q'} < \frac{lq - k * lp}{lp}\),那么原问题得解就是\(\frac{p' + k * q'}{q'}\)

算法的正确性是显然的。递归时新问题的最优解\(\frac{p'}{q'}\)一定对应原问题的最优解\(\frac{p}{q}\)。如果前者对应的不是后者的最优解,那么就一定可以通过原问题的最优解构造出一个新问题的解\(\frac{p''}{q''}\),使得这个解比\(\frac{p'}{q'}\)更优。

注意边界问题

时间复杂度\(O(r)\)

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define pL pair <LL, LL>
  4. using namespace std;
  5. int n; LL r;
  6. pL solve(LL lu, LL ld, LL ru, LL rd)
  7. {
  8. LL x = lu / ld + ;
  9. if (x * rd < ru) return pL(x, );
  10. if (!lu) return pL(, rd / ru + );
  11. if (lu <= ld && ru <= rd)
  12. {pL nw = solve(rd, ru, ld, lu); return pL(nw.second, nw.first);}
  13. x = lu / ld;
  14. pL nw = solve(lu - ld * x, ld, ru - rd * x, rd);
  15. nw.first += nw.second * x;
  16. return nw;
  17. }
  18. int main()
  19. {
  20. while (scanf("%d 0.%lld", &n, &r) == )
  21. {
  22. if (r == ) {puts(""); continue;}
  23. LL x = ; while (n --) x *= ;
  24. LL lu = r * - , ld = x, ru = r * + , rd = x;
  25. for( ; lu % == && ld % == ; lu /= , ld /= );
  26. for( ; ru % == && rd % == ; ru /= , rd /= );
  27. pL ans = solve(lu, ld, ru, rd);
  28. //printf("%lld %lld\n", ans.first, ans.second);
  29. printf("%lld\n", min(ans.second, ld));
  30. }
  31. }

2713: [Violet 2]愚蠢的副官

第三道神题……我dp被卡常数了,极限数据要跑8s……交标程走人

2714: [Violet 3]交替和

数位dp

定义一个数的交替和为将该数从高位到低位添加至序列L后,A(L)的值,比如\(1101B\)的交替和为\(-1\)

定义\(f_{0,i}\)表示b进制下,所有可以有前导零的i位数的交替和的和。

定义\(f_{1,i}\)表示b进制下,所有可以有前导零的i位偶数的交替和减去所有可以有前导零的i位奇数的交替和

设\(n\)在\(b\)进制下有\(len\)位

那么答案由两部分组成。第一部分是位数在\(1\)~\(len-1\)之间的数,第二部分是位数为\(len\)的数。

  维护当前要计算的第一个数位对答案的贡献的系数\(np\)。

  第一部分枚举位数,最高位,用\(f\)以及\(np\)计算贡献
  第二部分枚举与n从第几位开始不同,以及这一位选了多少,依然用\(f\)以及\(np\)计算贡献

时间复杂度\(O(blogn)\)

  1. /**************************************************************
  2.     Problem: 2714
  3.     User: AwD
  4.     Language: C++
  5.     Result: Accepted
  6.     Time:0 ms
  7.     Memory:1296 kb
  8. ****************************************************************/
  9.  
  10. #include <bits/stdc++.h>
  11. #define LL long long
  12. using namespace std;
  13. LL b, n;
  14. LL f[][], g[];
  15. LL ni[], nl, ans;
  16. int main()
  17. {
  18.     cin >> b >> n;
  19.     g[] = ;
  20.     for (LL i = , j = ; j <= n; ++ i, j *= b)
  21.     {
  22.         LL np = ;
  23.         for (LL k = ; k < b; ++ k)
  24.             f[][i] += f[][i - ] * - + g[i - ] * k,
  25.             f[][i] += f[][i - ] * -np + (g[i - ] & ) * k * np,
  26.             np = np * ((g[i - ] * i)& ? -: );
  27.         g[i] = g[i - ] * b;
  28.     }
  29.     while (n)
  30.     {
  31.         ni[++ nl] = n % b;
  32.         n /= b;
  33.     }
  34.     {
  35.         LL np = , s = ;
  36.         for (LL i = ; i < nl; ++ i)
  37.         {
  38.             for (LL k = ; k < b; ++ k)
  39.                 ans += f[i & ][i - ] * -np + (i & ? g[i - ] & : g[i - ]) * k * np,
  40.                 np = np * ((g[i - ] * i) & ? -: );
  41.         }
  42.         //cout << ans << "\n";
  43.  
  44.         for (LL i = nl; i >= ; -- i)
  45.         {
  46.             for (LL k = (i == nl); k <= (ni[i] - (i != )); ++ k)
  47.                 ans += f[nl & ][i - ] * ((nl - i) & ? : -) * np + (nl & ? g[i - ] & : g[i - ]) * (s + ((nl - i) & ? -: ) * k) * np,
  48.                 np = np * ((g[i - ] * nl) & ? -: );
  49.             s += ((nl - i) & ? -: ) * ni[i];
  50.         }
  51.         cout << ans << "\n";
  52.     }
  53. }

2715: [Violet 3]最优指令

状压所有状态是否可以出现,简单bfs即可

时间复杂度\(O(2^SC)\)

  1. #include <bits/stdc++.h>
  2. #define N (1 << 17)
  3. using namespace std;
  4. int s, c;
  5. int dis[N], vis[N];
  6. queue <int> Q;
  7. int pres[N], prei[N];
  8. int trans[][];
  9. void dfs(int t)
  10. {
  11. if (t != ( << s) - )
  12. {
  13. dfs(pres[t]);
  14. if (prei[t] < ) printf("%d", prei[t]);
  15. else printf("%c", prei[t] - + 'a');
  16. }
  17. }
  18. int main()
  19. {
  20. scanf("%d%d", &s, &c);
  21. for (int i = ; i < s; ++ i)
  22. for (int j = ; j < c; ++ j)
  23. scanf("%d", &trans[i][j]);
  24. Q.push(( << s) - ); vis[( << s) - ] = ;
  25. while (!Q.empty())
  26. {
  27. int hd = Q.front(); Q.pop();
  28. for (int i = ; i < c; ++ i)
  29. {
  30. int nw = ;
  31. for (int j = ; j < s; ++ j)
  32. if (hd & ( << j))
  33. nw |= ( << trans[j][i]);
  34. if (!vis[nw])
  35. {
  36. vis[nw] = ;
  37. dis[nw] = dis[hd] + ;
  38. pres[nw] = hd;
  39. prei[nw] = i;
  40. Q.push(nw);
  41. }
  42. }
  43. }
  44. if (!vis[]) puts("impossible");
  45. else dfs();
  46. }

2716: [Violet 3]天使玩偶

裸的k-d树,我的常数写的好挫啊QAQ

时间复杂度\(O((n+m)\sqrt{n + m})\)

  1. #include <bits/stdc++.h>
  2. #define INF 100000000
  3. #define N 1000100
  4. using namespace std;
  5. int n, m;
  6. struct point {int d[];};
  7. struct node
  8. {
  9. int opt, ch[], si;
  10. int bd[][];
  11. point mid;
  12. } tr[N];
  13. stack <int> S;
  14. int nw, tmp;
  15. int comp(point a, point b) {return a.d[nw] < b.d[nw];}
  16. point ls[N];
  17. void dfs_dele(int t)
  18. {
  19. if (tr[t].ch[]) dfs_dele(tr[t].ch[]);
  20. ls[++ tmp] = tr[t].mid;
  21. if (tr[t].ch[]) dfs_dele(tr[t].ch[]);
  22. tr[t].ch[] = tr[t].ch[] = ;
  23. tr[t].opt = tr[t].si = ;
  24. S.push(t);
  25. }
  26. void update(int t)
  27. {
  28. tr[t].bd[][] = min(tr[t].mid.d[], min(tr[tr[t].ch[]].bd[][], tr[tr[t].ch[]].bd[][]));
  29. tr[t].bd[][] = max(tr[t].mid.d[], max(tr[tr[t].ch[]].bd[][], tr[tr[t].ch[]].bd[][]));
  30. tr[t].bd[][] = min(tr[t].mid.d[], min(tr[tr[t].ch[]].bd[][], tr[tr[t].ch[]].bd[][]));
  31. tr[t].bd[][] = max(tr[t].mid.d[], max(tr[tr[t].ch[]].bd[][], tr[tr[t].ch[]].bd[][]));
  32. }
  33. int rebuild(int opt, int l, int r)
  34. {
  35. nw = opt; sort(ls + l, ls + r + , comp);
  36. int mid = (l + r) / ;
  37. int hd = S.top(); S.pop();
  38. tr[hd].mid = ls[mid];
  39. tr[hd].opt = opt; tr[hd].si = r - l + ;
  40. if (l < mid) tr[hd].ch[] = rebuild(!opt, l, mid - );
  41. if (mid < r) tr[hd].ch[] = rebuild(!opt, mid + , r);
  42. update(hd);
  43. return hd;
  44. }
  45. int insert(int opt, int t, point nw)
  46. {
  47. if (!t)
  48. {
  49. t = S.top(); S.pop();
  50. tr[t].opt = opt;
  51. tr[t].si = ; tr[t].mid = nw;
  52. }
  53. else
  54. {
  55. int k = tr[t].mid.d[tr[t].opt] < nw.d[tr[t].opt];
  56. tr[t].si ++;
  57. tr[t].ch[k] = insert(!opt, tr[t].ch[k], nw);
  58. if (1.0 * tr[tr[t].ch[k]].si / tr[t].si > 0.7)
  59. {
  60. tmp = ; dfs_dele(t);
  61. t = rebuild(opt, , tmp);
  62. }
  63. }
  64. update(t);
  65. return t;
  66. }
  67. int nowans;
  68. int dis(point a, point b)
  69. {
  70. return abs(a.d[] - b.d[]) + abs(a.d[] - b.d[]);
  71. }
  72. int dis(point a, int t)
  73. {
  74. int tmp = ;
  75. for (int i = ; i <= ; ++ i)
  76. if (a.d[i] < tr[t].bd[i][]) tmp += tr[t].bd[i][] - a.d[i];
  77. for (int i = ; i <= ; ++ i)
  78. if (a.d[i] > tr[t].bd[i][]) tmp += a.d[i] - tr[t].bd[i][];
  79. return tmp;
  80. }
  81. int s, dp;
  82. void ask(int t, point nw)
  83. {
  84. s ++;
  85. if (dis(tr[t].mid, nw) < nowans) nowans = dis(tr[t].mid, nw);
  86. int b[];
  87. b[] = dis(nw, tr[t].ch[]);
  88. b[] = dis(nw, tr[t].ch[]);
  89. int k = b[] < b[];
  90. if (tr[t].ch[k]) if (b[k] < nowans) ask(tr[t].ch[k], nw);
  91. if (tr[t].ch[!k]) if (b[!k] < nowans) ask(tr[t].ch[!k], nw);
  92. //dp --;
  93. }
  94. int root;
  95. int main()
  96. {
  97. tr[].bd[][] = tr[].bd[][] = INF;
  98. scanf("%d%d", &n, &m);
  99. for (int i = N - ; i >= ; -- i) S.push(i);
  100. for (int i = ; i <= n + m; ++ i)
  101. {
  102. int t = , x, y;
  103. if (i > n) scanf("%d", &t);
  104. scanf("%d%d", &x, &y);
  105. nowans = INF;
  106. if (t == ) root = insert(, root, (point){x, y});
  107. else
  108. {
  109. s = ;
  110. ask(root, (point){x, y});
  111. printf("%d\n", nowans);
  112. }
  113. }
  114. }

2717: [Violet 4]迷路的兔子

第四道神题= =

奥妙重重的构造题,只要知道这是对的就好了是不是哇QAQ

时间复杂度\(O(n^2)\)

  1. #include <bits/stdc++.h>
  2. #define N 1000
  3. using namespace std;
  4. int n, x;
  5. int remain[N][N];
  6. int main()
  7. {
  8. cin >> n;
  9. cout << n * (n - ) / << "\n";
  10. for (int i = ; i <= (n >> ); ++ i)
  11. for (int j = ; j <= n; ++ j)
  12. cout << j << " " << (j + i - ) % n + << " " << (j + i + i - ) % n + << "\n";
  13. }

2718: [Violet 4]毕业旅行

建二分图,把每个点\(i\)拆成两个点\(A_i\),\(B_i\)

用传递闭包把原图中每个点能到达的点都跑出来,若\(i\)能到达\(j\),那么就在新图中将\(A_i\)与\(B_j\)连一条边。

那么原图的独立集就相当于新图中的独立集。直接上匈牙利。

时间复杂度\(O(n^3)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, m;
  4. int sx[][];
  5. int vx[], vy[], pr[];
  6. int ans;
  7. int dfs(int t)
  8. {
  9. vx[t] = ;
  10. for (int i = ; i <= n; ++ i)
  11. if (sx[t][i] && !vy[i] && !vx[pr[i]])
  12. {
  13. if (!pr[i] || dfs(pr[i]))
  14. {
  15. pr[i] = t;
  16. return ;
  17. }
  18. }
  19. return ;
  20. }
  21. int main()
  22. {
  23. scanf("%d%d", &n, &m);
  24. for (int i = ; i <= m; ++ i)
  25. {
  26. int a, b;
  27. scanf("%d%d", &a, &b);
  28. sx[a][b] = ;
  29. }
  30. for (int k = ; k <= n; ++ k)
  31. for (int i = ; i <= n; ++ i)
  32. for (int j = ; j <= n; ++ j)
  33. if (sx[i][k] && sx[k][j])
  34. sx[i][j] |= ;
  35. for (int i = ; i <= n; ++ i)
  36. {
  37. for (int j = ; j <= n; ++ j) vx[j] = vy[j] = ;
  38. if (dfs(i)) ans ++;
  39. }
  40. printf("%d", n - ans);
  41. }

2719: [Violet 4]银河之星

由于第二种移动的存在,所有在模三意义下同余的位置是等价的,因此可以缩在一起。

直接上记搜。

注意两个坑点:

  1.由于棋盘大小的限制,某些情况下第二种移动是没法做的,因此要现判断这些移动的可行性。

  2.由于棋盘大小的限制,每种位置能放的棋子的数量是有上限的,搜索时要判断一下

时间复杂度O(跑的出)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int k, n, m, fin_x, fin_y;
  4. int fin;
  5. struct status
  6. {
  7. int ss[];
  8. status () {for (int i = ; i < ; ++ i) ss[i] = ;}
  9. };
  10. int operator <(status a, status b)
  11. {
  12. for (int i = ; i < ; ++ i)
  13. if (a.ss[i] != b.ss[i])
  14. return a.ss[i] < b.ss[i];
  15. return ;
  16. }
  17. map <status, int> M;
  18. int xd[] = {-, -, -, , , , , };
  19. int yd[] = {-, , , , , , -, -};
  20. int ai[], bi[], ci[], tot;
  21. int cg[][], mx[];
  22. int get_pos(int x, int y)
  23. {
  24. x = x % ;
  25. y = y % ;
  26. return x * + y;
  27. }
  28. int dfs(status nw)
  29. {
  30. if (M.count(nw)) return M[nw];
  31. int is_ans = ;
  32. for (int i = ; i < ; ++ i)
  33. if (((bool)nw.ss[i]) ^ (i == fin))
  34. is_ans = ;
  35. if (is_ans) return ;
  36. for (int i = ; i < tot; ++ i)
  37. if (nw.ss[ai[i]] && nw.ss[bi[i]])
  38. {
  39. status nx = nw;
  40. nx.ss[ai[i]] --;
  41. nx.ss[bi[i]] --;
  42. nx.ss[ci[i]] ++;
  43. if (nx.ss[ci[i]] > mx[ci[i]]) continue;
  44. if (dfs(nx)) return M[nw] = ;
  45. }
  46. return M[nw] = ;
  47. }
  48. void init()
  49. {
  50. for (int i = ; i < ; ++ i)
  51. for (int j = ; j < ; ++ j)
  52. cg[i][j] = -;
  53. for (int i = ; i < ; ++ i) mx[i] = ;
  54. for (int i = ; i <= n; ++ i)
  55. for (int j = ; j <= m; ++ j)
  56. {
  57. mx[get_pos(i, j)] ++;
  58. for (int d = ; d < ; ++ d)
  59. if (i + xd[d] * >= && i + xd[d] * <= n && j + yd[d] * >= && j + yd[d] * <= m)
  60. cg[get_pos(i, j)][get_pos(i + xd[d], j + yd[d])] = get_pos(i + xd[d] * , j + yd[d] * );
  61. }
  62. tot = ;
  63. for (int i = ; i < ; ++ i)
  64. for (int j = ; j < ; ++ j)
  65. if (cg[i][j] >= )
  66. {
  67. ai[tot] = i;
  68. bi[tot] = j;
  69. ci[tot] = cg[i][j];
  70. tot ++;
  71. }
  72. }
  73. int main()
  74. {
  75. while (scanf("%d%d%d%d%d", &k, &n, &m, &fin_x, &fin_y) == )
  76. {
  77. fin = get_pos(fin_x, fin_y);
  78. M.clear();
  79. status start;
  80. for (int i = ; i <= k; ++ i)
  81. {
  82. int x, y;
  83. scanf("%d%d", &x, &y);
  84. start.ss[get_pos(x, y)] ++;
  85. }
  86. init();
  87. if (dfs(start)) puts("Yes");
  88. else puts("No");
  89. }
  90. }

2720: [Violet 5]列队春游

数学题,推推式子可以得到结论

时间复杂度\(O(nlogn)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, s;
  4. int ai[];
  5. double ans;
  6.  
  7. int main()
  8. {
  9. scanf("%d", &n);
  10. for (int i = ; i <= n; ++ i) scanf("%d", &ai[i]);
  11. sort(ai + , ai + n + );
  12. for (int i = , j = ; i <= n; ++ i)
  13. if (ai[i] != ai[i + ])
  14. {
  15. ans += 1.0 * (i - j) * (n + ) / (n + - j);
  16. j = i;
  17. }
  18. printf("%.2lf", ans);
  19. }

2721: [Violet 5]樱花

又是一道数学题,答案是\((n!)^2\)的约数个数,筛一下素数即可

时间复杂度\(O(n)\) (还是\(O(nloglogn)\)?)

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<ctime>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #define ll long long
  9. #define mod 1000000007
  10. #define inf 1000000000
  11. using namespace std;
  12. int read()
  13. {
  14. int x=;char ch=getchar();
  15. while(ch<''||ch>'')ch=getchar();
  16. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  17. return x;
  18. }
  19. int n,cnt;
  20. ll ans=;
  21. int pri[],mn[],num[];
  22. bool del[];
  23. void getpri()
  24. {
  25. for(int i=;i<=n;i++)
  26. {
  27. if(!del[i])pri[++cnt]=i,mn[i]=cnt;
  28. for(int j=;pri[j]*i<=n&&j<=cnt;j++)
  29. {
  30. del[pri[j]*i]=;mn[pri[j]*i]=j;
  31. if(i%pri[j]==)break;
  32. }
  33. }
  34. }
  35. void cal(int x)
  36. {
  37. while(x!=)
  38. {
  39. num[mn[x]]++;
  40. x/=pri[mn[x]];
  41. }
  42. }
  43. int main()
  44. {
  45. n=read();
  46. getpri();
  47. for(int i=;i<=n;i++)
  48. cal(i);
  49. for(int i=;i<=cnt;i++)
  50. ans=ans*(num[i]*+)%mod;
  51. printf("%lld\n",ans);
  52. return ;
  53. }

2722: [Violet 5]爱的花环

还是神题= =

由于\(A_{i,j}=A_{j,i}\)

因此\(l_{i,j}\)和\(l_{j,i}\)的限制,\(r_{i,j}\)和\(r_{j,i}\)的限制可以分别合并在一起。

且\(\sum_{i=1}^{n}\sum_{j=1}^{n}A_{i,j}=0\)可以化为:\(\sum_{i=1}^{n}A_{i,i} + 2\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_{i,j}=0\)。

考虑做以下变换:

  对于所有满足\(i!=j\)的数对\((i,j)\),将\(l_{i,j}\)、\(r_{i,j}\)翻倍。

  对于所有\(k_{i,i}\),将其翻倍。

在这个变换之后,原问题就转化为了:求一个满足

  \(\sum_{i=1}^{n}\sum_{j=i}^{n}A_{i,j}=0\),

  \(l_{i,j}\leq A_{i,j}\leq r_{i,j}\),

  对于所有\(i != j\),有\(A_{i,j}mod2=0\)

这些限制的数组\(A\),使得\(\sum_{i=1}^{n}\sum_{j=i}^{n}k_{i,j}A_{i,j}\)最大。

这个问题得到的答案是原问题的两倍。

现考虑如何解决这个问题。

首先先排除对于所有\(i != j\),有\(A_{i,j}mod2=0\)这个限制,由于\(k_{i,j}\)为正,可以这样做:

  1.将所有\(A_{i,j}\)赋值为\(r_{i,j}\)

  2.如果当前\(\sum_{i=1}^{n}\sum_{j=i}^{n}A_{i,j}=0\),结束,返回答案

  3.否则在满足\(A_{i,j}!=l_{i,j}\)的数对\((i,j)\)中找一个\(k_{i,j}\)最小的,将它的\(A_{i,j}\)减小,减小到满足下面任意一条限制为止:

    a.\(\sum_{i=1}^{n}\sum_{j=i}^{n}A_{i,j}=0\)

    b.\(A_{i,j}=l_{i,j}\)

  4.转至步骤2

这个贪心的正确性是明显的。

那么加上对于所有\(i != j\),有\(A_{i,j}mod2=0\) 这个限制。考虑会发生什么:

  可能会出现一个\(A_{i,j}(i != j)\)变成奇数了。

为了满足这个限制,需要改变它的奇偶性。这个值从哪里来?只能从某一个\(A_{p,p}\)中来。

让答案尽可能的优,我们需要找到一个\(abs(k_{p,p} - k_{i,j})\)最小的\((p, p)\),并在\((p, p)\),\((i, j)\)之间移动一个1即可。

然后就是这样了……

时间复杂度\(O(n^2logn^2)\)

  1. #include <bits/stdc++.h>
  2. #define N 300000
  3. #define INF 100000000
  4. #define LL long long
  5. using namespace std;
  6. LL n;
  7. LL ss[][], pp[][], tot;
  8. LL ki[N], li[N], ri[N];
  9. LL nw[N];
  10. LL ord[N], nwsum, ans;
  11. LL comp(LL a, LL b)
  12. {
  13. return ki[a] < ki[b];
  14. }
  15. int main()
  16. {
  17. //freopen("garland6.in", "r", stdin);
  18. scanf("%lld", &n);
  19. for (LL i = ; i <= n; ++ i) ss[i][i] = ++ tot;
  20. for (LL i = ; i <= n; ++ i)
  21. for (LL j = i + ; j <= n; ++ j)
  22. ss[i][j] = ss[j][i] = ++ tot;
  23. for (LL i = ; i <= n * (n - ); ++ i)
  24. li[i] = -INF, ri[i] = INF, ki[i] = ;
  25. for (LL i = ; i <= n; ++ i)
  26. for (LL j = ; j <= n; ++ j)
  27. {
  28. LL a;
  29. scanf("%lld", &a);
  30. ki[ss[i][j]] += a;
  31. }
  32. for (LL i = ; i <= n; ++ i)
  33. for (LL j = ; j <= n; ++ j)
  34. {
  35. LL a;
  36. scanf("%lld", &a);
  37. li[ss[i][j]] = max(li[ss[i][j]], a);
  38. }
  39. for (LL i = ; i <= n; ++ i)
  40. for (LL j = ; j <= n; ++ j)
  41. {
  42. LL a;
  43. scanf("%lld", &a);
  44. ri[ss[i][j]] = min(ri[ss[i][j]], a);
  45. }
  46. for (LL i = ; i <= n; ++ i) ki[i] *= ;
  47. for (LL i = n + ; i <= tot; ++ i) li[i] *= , ri[i] *= ;
  48. //for (LL i = 1; i <= tot; ++ i) cout << li[i] << " "; cout << "\n";
  49. //for (LL i = 1; i <= tot; ++ i) cout << ri[i] << " "; cout << "\n";
  50. //for (LL i = 1; i <= tot; ++ i) cout << ki[i] << " "; cout << "\n";
  51. for (LL i = ; i <= tot; ++ i) ord[i] = i;
  52. sort(ord + , ord + tot + , comp);
  53. for (LL i = ; i <= tot; ++ i) nw[i] = ri[i], nwsum += ri[i];
  54. for (LL i = ; i <= tot; ++ i)
  55. if (nwsum > ri[ord[i]] - li[ord[i]]) nwsum -= ri[ord[i]] - li[ord[i]], nw[ord[i]] = li[ord[i]];
  56. else if (ord[i] <= n || nwsum % == )
  57. {
  58. nw[ord[i]] -= nwsum; break;
  59. }
  60. else
  61. {
  62. nw[ord[i]] -= nwsum;
  63. LL p = i, q = i;
  64. while (ord[q] > n && q <= tot) ++ q;
  65. while (ord[p] > n && p >= ) -- p;
  66. if (p < || (q <= tot && ki[ord[q]] - ki[ord[i]] < ki[ord[i]] - ki[ord[p]]))
  67. {
  68. nw[ord[i]] ++;
  69. nw[ord[q]] --;
  70. }
  71. else
  72. {
  73. nw[ord[i]] --;
  74. nw[ord[p]] ++;
  75. }
  76. break;
  77. }
  78. for (LL i = ; i <= n; ++ i)
  79. for (LL j = ; j <= n; ++ j)
  80. if (i == j)
  81. pp[i][j] = nw[ss[i][j]];
  82. else
  83. {
  84. pp[i][j] = nw[ss[i][j]] / ;
  85. if (nw[ss[i][j]] % == ) puts("mdzz");
  86. }
  87. /*
  88. for (LL i = 1; i <= n; ++ i)
  89. {
  90. for (LL j = 1; j <= n; ++ j) printf("%d ", pp[i][j]);
  91. puts("");
  92. }*/
  93. for (LL i = ; i <= tot; ++ i) ans += nw[i] * ki[i];
  94. printf("%lld", ans / );
  95. }

2723: [Violet 6]星之波动

好像很神的样子QAQ,不敢看

2724: [Violet 6]蒲公英

很显然的分块,l~r之间的众数只可能出现在:l~块a的众数,块a~块b的众数,块b~r的众数之间,预处理出任意两块之间的众数,乱搞即可。

时间复杂度\(O(n\sqrt{n})\)

  1. #include <bits/stdc++.h>
  2. #define N 50000
  3. #define P 1000
  4. using namespace std;
  5. int n, m, s;
  6. int ai[N], si[N];
  7. int mx[P][P], in[N], st[N];
  8. vector <int> L[N], S;
  9. int nowi[N], nowmax;
  10. int get(int t, int l, int r)
  11. {
  12. int p = (upper_bound(L[t].begin(), L[t].end(), r) - lower_bound(L[t].begin(), L[t].end(), l)) * (n + ) - t;
  13. return p;
  14. }
  15. int main()
  16. {
  17. scanf("%d%d", &n, &m); s = sqrt(n / (log(n) / log())) + ;
  18. for (int i = ; i <= n; ++ i)
  19. scanf("%d", &ai[i]), si[i] = ai[i];
  20. sort(si + , si + n + );
  21. for (int i = ; i <= n; ++ i)
  22. ai[i] = lower_bound(si + , si + n + , ai[i]) - si;
  23. for (int i = ; i <= n; ++ i) L[ai[i]].push_back(i);
  24. for (int i = , p = ; i <= n; i += s, ++ p)
  25. for (int j = ; j <= s && i + j - <= n; ++ j)
  26. in[i + j - ] = p;
  27.  
  28. for (int i = ; i <= n; i += s)
  29. {
  30. for (int j = ; j <= n; ++ j) nowi[j] = ;
  31. for (int j = i; j <= n; ++ j)
  32. {
  33. nowi[ai[j]] ++;
  34. if (nowi[ai[j]] > nowi[nowmax] || nowi[ai[j]] == nowi[nowmax] && ai[j] < nowmax)
  35. nowmax = ai[j];
  36. if (in[j] != in[j + ]) mx[in[i]][in[j]] = nowmax;
  37. }
  38. }
  39. for (int i = , last = ; i <= m; ++ i)
  40. {
  41. int l, r, ans = ;
  42. scanf("%d%d", &l, &r);
  43. //last = 0;
  44. l = (l + last - ) % n + ;
  45. r = (r + last - ) % n + ;
  46. if (l > r) swap(l, r);
  47. S.clear();
  48. if (in[l] == in[r]) for (int i = l; i <= r; ++ i) S.push_back(ai[i]);
  49. else
  50. {
  51. for (int i = l; in[i] == in[l]; ++ i) S.push_back(ai[i]);
  52. for (int i = r; in[i] == in[r]; -- i) S.push_back(ai[i]);
  53. S.push_back(mx[in[l] + ][in[r] - ]);
  54. }
  55. for (int i = ; i < S.size(); ++ i)
  56. if (get(S[i], l, r) > get(ans, l, r))
  57. ans = S[i];
  58. ans = si[ans];
  59. printf("%d\n", ans);
  60. last = ans;
  61. }
  62. }

2725: [Violet 6]故乡的梦

终于要写完了QAQ

首先从\(s\)开始建最短路径生成树。

定义关键路径为该树上\(s\)->\(t\)的路径。

定义一个点的\(dep\)

  若一个点在关键路径上,则该点的\(dep\)为它是关键路径上的第几个点。

  若一个点不在关键路径上,则该点的\(dep\)为它沿着树边走,到达第一个在关键路径上的点的\(dep\)。

很明显,如果切断的边\((x, y)\)如果不在关键路径上的话,最短路是不会变的。

因此考虑\((x, y)\)在树上的情况,假定x是y的父亲。

考虑这时的路径是怎样的:\(s\)->\(x'\)->\(y'\)->\(t\)

其中\(s\)->\(x'\)是在原图上\(s\)到\(x'\)的最短路,且\(x'\)尽可能的晚,\(y'\)->\(t\)是原图上\(y'\)到\(t\)的最短路,且\(y'\)尽可能的早。

这三段一定不能含有\(x\)->\(y\)

首先考虑\(s\)->\(x'\)这一段,要使得其中没有\(x\)->\(y\),只需要保证\(dep_{x'}\leq dep_{x}\)即可

接着考虑\(y'\)->\(t\)这一段,要使得其中没有\(x\)->\(y\),只需要保证\(dep_{y}\leq dep_{y'}\)即可。由于最短路不会绕一圈,这个的正确性是显然的。

最后考虑\(x'\)->\(y'\)这一段

  假设\(x'\)->\(y'\)不止一条边,那么设其中有一个点\(a\),因此这一段就变成了\(x'\)->\(a\)->\(y'\)

  但是由于只切断了一条边,因此\(a\)到\(s\)或者\(t\)中一个点的路径一定是最短路,于之前的设定矛盾。

  因此\(x'\)->\(y'\)只有一条边。

于是我们可以枚举每条不在最短路图上的边\((a, b)\),用它去更新切断边在\(\left [  dep_{a},dep_{b} \right ]\)内的答案。用线段树维护即可

时间复杂度\(O((n+m)logn)\)

  1. #include <bits/stdc++.h>
  2. #define N 300000
  3. #define M 900000
  4. #define INF 1000000000000000ll
  5. #define LL long long
  6. using namespace std;
  7. LL n, m, s, e;
  8. vector <LL> bi[N], ci[N];
  9. LL vis[N];
  10. LL dis[N], die[N], pre[N], lst[N], tot;
  11. LL inls[N];
  12. struct node {LL t, d;};
  13. struct comp {LL operator () (node a, node b) {return a.d > b.d;}};
  14. priority_queue <node, vector <node>, comp> H;
  15.  
  16. queue <LL> Q;
  17.  
  18. void dfs1(int t, int p)
  19. {
  20. inls[t] = p;
  21. for (LL i = ; i < bi[t].size(); ++ i)
  22. if (pre[bi[t][i]] == t)
  23. if (inls[bi[t][i]]) dfs1(bi[t][i], inls[bi[t][i]]);
  24. else dfs1(bi[t][i], p);
  25. }
  26.  
  27. LL mn[M], finmn[N];
  28. void put_min(LL t, LL lb, LL rb, LL l, LL r, LL d)
  29. {
  30. if (lb == l && rb == r) {mn[t] = min(mn[t], d); return;}
  31. LL ml = (lb + rb) / , mr = (lb + rb) / + ;
  32. if (l <= ml) put_min(t * , lb, ml, l, min(r, ml), d);
  33. if (r >= mr) put_min(t * + , mr, rb, max(l, mr), r, d);
  34. }
  35. void dfs_seg(LL t, LL lb, LL rb)
  36. {
  37. if (lb != rb)
  38. {
  39. mn[t * ] = min(mn[t * ], mn[t]);
  40. dfs_seg(t * , lb, (lb + rb) / );
  41. mn[t * + ] = min(mn[t * + ], mn[t]);
  42. dfs_seg(t * + , (lb + rb) / + , rb);
  43. }
  44. else finmn[lb] = mn[t];
  45. }
  46. LL q;
  47. int main()
  48. {
  49. scanf("%lld%lld", &n, &m);
  50. for (LL i = ; i <= m; ++ i)
  51. {
  52. LL a, b, c;
  53. scanf("%lld%lld%lld", &a, &b, &c);
  54. bi[a].push_back(b); ci[a].push_back(c);
  55. bi[b].push_back(a); ci[b].push_back(c);
  56. }
  57. scanf("%lld%lld", &s, &e);
  58. for (LL i = ; i <= n; ++ i)
  59. dis[i] = INF;
  60. dis[s] = ; H.push((node){s, });
  61. while (!H.empty())
  62. {
  63. LL hd;
  64. do hd = H.top().t, H.pop();
  65. while (vis[hd] && !H.empty());
  66. if (vis[hd]) break; else vis[hd] = ;
  67. for (LL i = ; i < bi[hd].size(); ++ i)
  68. if (dis[hd] + ci[hd][i] < dis[bi[hd][i]])
  69. dis[bi[hd][i]] = dis[hd] + ci[hd][i],
  70. pre[bi[hd][i]] = hd,
  71. H.push((node){bi[hd][i], dis[bi[hd][i]]});
  72. }
  73.  
  74. for (LL i = ; i <= n; ++ i) vis[i] = ;
  75. for (LL i = ; i <= n; ++ i)
  76. die[i] = INF;
  77. die[e] = ; H.push((node){e, });
  78. while (!H.empty())
  79. {
  80. LL hd;
  81. do hd = H.top().t, H.pop();
  82. while (vis[hd] && !H.empty());
  83. if (vis[hd]) break; else vis[hd] = ;
  84. for (LL i = ; i < bi[hd].size(); ++ i)
  85. if (die[hd] + ci[hd][i] < die[bi[hd][i]])
  86. die[bi[hd][i]] = die[hd] + ci[hd][i],
  87. H.push((node){bi[hd][i], die[bi[hd][i]]});
  88. }
  89.  
  90. for (LL p = e; p; p = pre[p])
  91. lst[++ tot] = p, inls[p] = tot;
  92.  
  93. dfs1(s, inls[s]);
  94. for (LL i = ; i <= tot * ; ++ i) mn[i] = INF;
  95. for (LL i = ; i <= n; ++ i)
  96. for (LL j = ; j < bi[i].size(); ++ j)
  97. if (inls[i] > inls[bi[i][j]] && pre[bi[i][j]] != i)
  98. put_min(, , tot, inls[bi[i][j]], inls[i] - , dis[i] + ci[i][j] + die[bi[i][j]]);
  99. dfs_seg(, , tot);
  100.  
  101. scanf("%lld", &q);
  102. for (LL i = ; i <= q; ++ i)
  103. {
  104. LL a, b;
  105. scanf("%lld%lld", &a, &b);
  106. if (inls[a] > inls[b]) swap(a, b);
  107. if (lst[inls[a]] == a && lst[inls[b]] == b && inls[b] - inls[a] == )
  108. if (finmn[inls[a]] != INF) printf("%lld\n", finmn[inls[a]]);
  109. else puts("Infinity");
  110. else printf("%lld\n", dis[e]);
  111. }
  112. }

呼~~~

bzoj violet系列 (2708~2725)的更多相关文章

  1. NOIP系列复习及题目集合

    首先是我的酱油记了啦~: Xs的NOIP2014酱油记,持续更新中 知识点方面: noip知识点总结之--贪心 noip知识点总结之--线性筛法及其拓展 noip知识点总结之--欧几里得算法和扩展欧几 ...

  2. poj3924

    题目:给定一个起点(xw1, yw1),直线经过(xw2, yw2),速度为vw无限运动的点,还有一个起点(xt1, yt1),终点(xt2, yt2),并且在以vt速度在两者往返运动,求两者在运动中 ...

  3. [原博客] BZOJ 2725 : [Violet 6]故乡的梦

    这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中  ...

  4. BZOJ 2725: [Violet 6]故乡的梦 最短路+线段树

    2725: [Violet 6]故乡的梦 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 678  Solved: 204[Submit][Status ...

  5. BZOJ 2708 [Violet 1]木偶 DP

    题意:id=2708">链接 方法: DP 解析: 这题太神辣. 做梦都没想到DP啊,反正我不会. 先谈一个我有过的错的想法. 最小费用最大流? 能匹配的边连费用为1的,不能匹配的连费 ...

  6. BZOJ 2725 [Violet 6]故乡的梦 线段树+最短路树

    \(\color{#0066ff}{ 题目描述 }\) \(\color{#0066ff}{输入格式}\) \(\color{#0066ff}{输出格式}\) \(\color{#0066ff}{输入 ...

  7. BZOJ 2725: [Violet 6]故乡的梦

    求出最短路径树,对于一个询问(x,y) 若不在树上S->T的链上,则答案不变,若在链上,考虑用一条非树边替换这条边,这条非树边必须跨越x->y这条边,线段树维护区间最小值 #include ...

  8. 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

    BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...

  9. 【BZOJ】【2850】【Violet 0】巧克力王国

    KD-Tree 问平面内在某条直线下方的点的权值和 我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$... 然而这并不对啊…… ...

随机推荐

  1. 常用linux手头命令

    过滤ip ifconfig eth0|grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}"|sed -n '1p' ifconfig|sed -n '2p' ...

  2. [LeetCode] Majority Element 求众数

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  3. 区块链(Blockchain)

    一 .什么是区块链? 区块链(Blockchain)是由节点参与的分布式数据库系统[1],它的特点是不可更改,不可伪造,也可以将其理解为账簿系统(ledger).它是比特币的一个重要概念,完整比特币区 ...

  4. Python批量扫描服务器指定端口状态

    闲来无事用Python写了一个简陋的端口扫描脚本,其简单的逻辑如下: 1. python DetectHostPort.py iplist.txt(存放着需要扫描的IP地址列表的文本,每行一个地址) ...

  5. 【总结】Javascript基础

    1.Javascript的数据类型 Number String Boolean Undefined Null Object 如下图,其中Number.String.Boolean.Undefined. ...

  6. 14 Generator

    Generator 就是可以返回多个结果,也是支持 Iterator 接口. function* helloWorldGenerator() { yield 'hello'; yield 'world ...

  7. 安装PHP sphinx扩展 sphinx-1.1.0/sphinx.c:105:2: error: too few arguments 错误

    表现: /home/sphinx-1.1.0/sphinx.c: In function 'php_sphinx_client_read_property':/home/sphinx-1.1.0/sp ...

  8. form表单的属性标签

    form表单的常用标签 表单: <form id="" name="" method="post/get" action=" ...

  9. 嵌入式 Linux下永久生效环境变量bashrc

    嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...

  10. [Java] Maven 安装和配置

    1. 下载 Maven 在百度输入 Maven 搜索 ,找到它的官网(http://maven.apache.org/),点击进入下载页面. 下载页面地址: http://maven.apache.o ...