[关闭]
@Falsyta 2015-10-01T03:03:37.000000Z 字数 17457 阅读 1922

2015.9月作战

OI


说是9月作战,其实也只有18后的不到两周而已……
然而状态仍然是起起落落的呢……
27题收尾,希望下一个月状态可以好一点吧……

目录

[0]TCO13 Round 1B 1000 EllysReversals
[1-]TCO13 Round 1A 1000 DirectionBoard
[0+]hdu 5451 Best Solver
[0-]hdu 5456 Matches Puzzle Game
[0+]hdu 5458 Stability
[0-]hdu 5459 Jesus Is Here
[0]ACM-ICPC 2015 Beijing Online F Couple Trees
[0++]ASC02 F Roads
[1+]TCO13 Round 2A 1000 ThePowers
[2-]TCO12 Wildcard 1000 StringSequence
[0-]TCO13 Round 2C 1000 WellTimedSearch
[0+]ASC02 H Tickets
[1]TCO 2013 Round 2B LitPanels
[3]TCO 2013 Round 3A TrickyInequality
[1+]TCO 2013 Semifinal 1 GameWithTree
[1-]TCO 2013 Semifinal 2 OneBlack
[2-]TCO 2013 Round 3B ToastJumping
[2-]TCO 2013 Finals TBlocks
[2]TCO 2013 Wildcard SemiMultiple
[0-+]hdu 5469 Antonidas
[0]hdu 5478 Can you find it
[0-]hdu 5489 Removed Interval
[0-]hdu 5493 Queue
[0]CF240F TorCoder
[2-]CF241D Numbers
[0]CF249E Endless Matrix
[1]CF241B Friends

9.18 金曜日

TCO13 Round 1B 1000 EllysReversals

【脱出战 Scene 3】

Infan: …………前方……或许……或许还有村庄呢…………
Fiya: 已经到了这种地步了么……
Infan: 咦?…………我还记得最后一条路…………不过…………算了。与其死在这里……不如拼命吧。
Fiya: 那就走吧。

TCO13 Round 1A 1000 DirectionBoard

9.19 土曜日

正名之战。
不过…………还是打输了啊………………

hdu 5451 Best Solver

原题BZOJ 4002
明明找个循环节的事情……我为什么找完以后还要矩阵快速幂啊………………
都是自己拖了队友的后腿…………

  1. # include <cstdio>
  2. # include <algorithm>
  3. # include <iostream>
  4. # include <string>
  5. using namespace std;
  6. # define REP(i, n) for (int i = 1; i <= n; i ++)
  7. # define FOR(i, a, b) for (int i = a; i <= b; i ++)
  8. typedef long long ll;
  9. int f[1001000];
  10. int Force (int P)
  11. {
  12. f[0] = 2 % P, f[1] = 10 % P;
  13. FOR (i, 2, 500000)
  14. {
  15. f[i] = (10 * f[i - 1] - f[i - 2] + P) % P;
  16. if (f[i] == f[1] && f[i - 1] == f[0]) return i - 1;
  17. }
  18. return -1;
  19. }
  20. int Pow2 (ll z, int P)
  21. {
  22. int res = 1, a = 2;
  23. do {if (z & 1) res = res * a % P; a = a * a % P;} while (z >>= 1);
  24. return res;
  25. }
  26. int q0;
  27. int main ()
  28. {
  29. scanf ("%d", &q0);
  30. ll n; int P;
  31. REP (id, q0)
  32. {
  33. scanf ("%lld%d", &n, &P);
  34. printf ("Case #%d: %d\n", id, (f[Pow2 (n, Force (P)) + 1] + P - 1) % P);
  35. }
  36. return 0;
  37. }

hdu 5456 Matches Puzzle Game

傻逼数位DP………………
一个10写成9调了半个小时…………

  1. # include <cstdio>
  2. # include <cstring>
  3. using namespace std;
  4. # define REP(i, n) for (int i = 1; i <= n; i ++)
  5. # define REP_0(i, n) for (int i = 0; i < n; i ++)
  6. # define CLR(a, x) memset (a, x, sizeof (a))
  7. unsigned f[510][2][2][2];
  8. int w[2][10] =
  9. {
  10. {0, 2, 5, 5, 4, 5, 6, 3, 7, 6},
  11. {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}
  12. };
  13. int q0, n, P;
  14. unsigned DFS (int rem, bool bS, bool cS, bool car)
  15. {
  16. if (rem < 0) return 0;
  17. if (!rem) return bS && cS && !car;
  18. unsigned &s = f[rem][bS][cS][car];
  19. if (s != -1) return s;
  20. s = 0;
  21. REP_0 (i, 10)
  22. REP_0 (j, 10)
  23. {
  24. int d = i - j + car * 10;
  25. if (0 <= d && d < 10) s += DFS (rem - w[1][i] - w[bS][j] - w[cS][d], bS || j, cS || d, false);
  26. if (s >= P) s -= P;
  27. d --;
  28. if (0 <= d && d < 10) s += DFS (rem - w[1][i] - w[bS][j] - w[cS][d], bS || j, cS || d, true);
  29. if (s >= P) s -= P;
  30. }
  31. return s;
  32. }
  33. int main ()
  34. {
  35. scanf ("%d", &q0);
  36. REP (id, q0)
  37. {
  38. scanf ("%d%d", &n, &P), n -= 3;
  39. CLR (f, -1);
  40. unsigned ans = 0;
  41. REP (fA, 9)
  42. REP_0 (fB, 10)
  43. {
  44. int d = fA - fB;
  45. if (0 <= d && d < 10) ans += DFS (n - w[1][fA] - w[0][fB] - w[0][d], fB, d, false);
  46. if (ans >= P) ans -= P;
  47. d --;
  48. if (0 <= d && d < 10) ans += DFS (n - w[1][fA] - w[0][fB] - w[0][d], fB, d, true);
  49. if (ans >= P) ans -= P;
  50. }
  51. printf ("Case #%d: %u\n", id, ans);
  52. }
  53. return 0;
  54. }

hdu 5458 Stability

倒过来跑一遍LCT 大暴力…………
时间复杂度O(NlogN)

  1. /* Template the Final Chapter Light --- Fimbulvetr version 0.1 */
  2. /* In this blizzard, I will find peace. */
  3. # define LOCAL
  4. # include <cstring>
  5. # include <cstdio>
  6. # include <algorithm>
  7. # include <vector>
  8. # include <string>
  9. # include <set>
  10. # include <map>
  11. # include <iostream>
  12. # include <cmath>
  13. using namespace std;
  14. # define REP( i, n ) for ( int i = 1; i <= n; i ++ )
  15. # define REP_0( i, n ) for ( int i = 0; i < n; i ++ )
  16. # define REP_0N( i, n ) for ( int i = 0; i <= n; i ++ )
  17. # define REP_D(i, n) for (int i = n; i >= 1; i --)
  18. # define REP_S( i, ss ) for ( char *i = ss; *i; i ++ )
  19. # define REP_G( i, u ) for ( int i = pos[ u ]; i; i = g[ i ].frt )
  20. # define FOR( i, a, b ) for ( int i = a; i <= b; i ++ )
  21. # define DWN( i, a, b ) for ( int i = b; i >= a; i -- )
  22. # define RST( a ) memset ( a, 0, sizeof ( a ) )
  23. # define CLR( a, x ) memset ( a, x, sizeof ( a ) )
  24. # define CPY( a, b ) memcpy ( a, b, sizeof ( a ) )
  25. typedef long long LL;
  26. const int inf = 1 << 30;
  27. # define NR 101000
  28. # define lc ch[ 0 ]
  29. # define rc ch[ 1 ]
  30. struct lctnode
  31. {
  32. int ch[ 2 ], sum, par, val; bool rev, cov;
  33. inline void Rev () {rev ^= 1, swap (lc, rc);}
  34. inline void Cov () {val = sum = 0, cov = 1;}
  35. inline void Rst ( bool ty ) {lc = rc = par = rev = cov = 0, val = sum = ty;}
  36. } lct[NR];
  37. int n, m, q0;
  38. # define u lct[ x ]
  39. # define ulfc lct[ u.lc ]
  40. # define urtc lct[ u.rc ]
  41. # define r lct[ y ]
  42. # define up lct[ u.par ]
  43. # define vc ch[ !ty ]
  44. # define tc ch[ ty ]
  45. inline void Upd ( int x ) { u.sum = ulfc.sum + urtc.sum + u.val; }
  46. inline void PD ( int x )
  47. {
  48. if ( u.rev ) { u.rev = false; if ( u.lc ) ulfc.Rev (); if ( u.rc ) urtc.Rev (); }
  49. if ( u.cov ) { u.cov = false; if ( u.lc ) ulfc.Cov (); if ( u.rc ) urtc.Cov (); }
  50. }
  51. inline int sgn ( int x ) { return up.lc == x ? 0 : up.rc == x ? 1 : -1; }
  52. inline void sc ( int x, int y, bool ty ) { u.tc = y, r.par = x; }
  53. inline void fix ( int x ) { if ( ~sgn ( x ) ) fix ( u.par ); PD ( x ); }
  54. inline void Rot ( int x, bool ty )
  55. {
  56. int y = u.par, z = r.par; if ( ~sgn ( y ) ) sc ( z, x, sgn ( y ) ); else u.par = z;
  57. sc ( y, u.vc, ty ), sc ( x, y, !ty ), Upd ( y );
  58. }
  59. inline int Splay ( int x )
  60. {
  61. fix ( x ); int t0, t1, y;
  62. while ( ~( t0 = sgn ( x ) ) )
  63. {
  64. if ( ~( t1 = sgn ( y = u.par ) ) ) Rot ( t0 ^ t1 ? x : y, t0 ), Rot ( x, t1 );
  65. else Rot ( x, t0 );
  66. }
  67. Upd ( x );
  68. return x;
  69. }
  70. inline int Acs ( int tx )
  71. {
  72. for ( int x = tx, y = 0; x; Upd ( y = x ), x = u.par ) Splay ( x ), u.rc = y;
  73. return Splay ( tx );
  74. }
  75. # define us lct[ Acs ( x ) ]
  76. inline int rt ( int x ) { for ( x = Acs ( x ); PD ( x ), u.lc; x = u.lc ) ; return Splay ( x ); }
  77. inline int Evt ( int x ) { us.Rev (); return x; }
  78. inline void Link ( int x, int y ) { Evt ( x ), u.par = y; }
  79. inline int Qry (int x, int y) { Evt ( x ); return lct[ Acs ( y ) ].sum; }
  80. inline void Mfy (int x, int y) { Evt ( x ); lct[ Acs ( y ) ].Cov (); }
  81. int psz, q;
  82. inline void Add (int x, int y)
  83. {
  84. if (rt (x) != rt (y)) psz ++, Link (x, psz), Link (y, psz);
  85. else Mfy (x, y);
  86. }
  87. typedef pair <int, int> pii;
  88. int ans[NR], op[NR], _x[NR], _y[NR];
  89. map <pii, int> g;
  90. inline pii gp (int a, int b) {return a < b ? make_pair (a, b) : make_pair (b, a);}
  91. int main ()
  92. {
  93. scanf ("%d", &q0);
  94. REP (id, q0)
  95. {
  96. printf ("Case #%d:\n", id);
  97. scanf ("%d%d%d", &n, &m, &q);
  98. REP (x, (n << 1) - 1) u.Rst (x > n);
  99. g.clear ();
  100. psz = n; int t1, t2;
  101. REP (i, m) scanf ("%d%d", &t1, &t2), g[gp (t1, t2)] ++;
  102. REP (i, q)
  103. {
  104. scanf ("%d%d%d", &op[i], &_x[i], &_y[i]);
  105. if (op[i] == 1) g[gp (_x[i], _y[i])] --;
  106. }
  107. for (map <pii, int>::iterator it = g.begin (); it != g.end (); it ++)
  108. if (it->second)
  109. Add ((it->first).first, (it->first).second);
  110. REP_D (i, q)
  111. {
  112. if (op[i] == 2) ans[i] = Qry (_x[i], _y[i]);
  113. else Add (_x[i], _y[i]);
  114. }
  115. REP (i, q) if (op[i] == 2) printf ("%d\n", ans[i]);
  116. }
  117. return 0;
  118. }

hdu 5459 Jesus Is Here

…………拼接处不会产生新的cff……

  1. # include <cstdio>
  2. # include <algorithm>
  3. # include <iostream>
  4. # include <string>
  5. using namespace std;
  6. # define REP(i, n) for (int i = 1; i <= n; i ++)
  7. # define FOR(i, a, b) for (int i = a; i <= b; i ++)
  8. typedef long long ll;
  9. const int P = 530600414;
  10. struct Arr
  11. {
  12. int len, sum, ans, cnt;
  13. Arr () {len = sum = ans = cnt = 0;}
  14. Arr (int _len, int _cnt, int _sum, int _ans) {len = _len, cnt = _cnt, sum = _sum, ans = _ans;}
  15. } f[202000];
  16. Arr operator + (Arr a, Arr b)
  17. {
  18. return Arr (
  19. (a.len + b.len) % P,
  20. (a.cnt + b.cnt) % P,
  21. (a.sum + b.sum + 1ll * b.cnt * a.len) % P,
  22. (a.ans + b.ans + (b.sum + 1ll * b.cnt * a.len) % P * a.cnt - 1ll * a.sum * b.cnt % P + P) % P);
  23. }
  24. int Solve (int n)
  25. {
  26. if (n <= 4) return 0;
  27. return f[n].ans;
  28. }
  29. void Init ()
  30. {
  31. f[3] = Arr (3, 1, 0, 0);
  32. f[4] = Arr (5, 1, 2, 0);
  33. FOR (i, 5, 201314) f[i] = f[i - 2] + f[i - 1];
  34. }
  35. int q0, n;
  36. int main ()
  37. {
  38. Init ();
  39. scanf ("%d", &q0);
  40. REP (id, q0) scanf ("%d", &n), printf ("Case #%d: %d\n", id, Solve (n));
  41. return 0;
  42. }

9.20 日曜日

ACM-ICPC 2015 Beijing Online Couple Trees

…………可持久化线段树显然……
O(NlogN)

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cassert>
  4. # include <algorithm>
  5. # include <iostream>
  6. using namespace std;
  7. # define REP(i, n) for (int i = 1; i <= n; i ++)
  8. # define REP_0(i, n) for (int i = 0; i < n; i ++)
  9. # define REP_D(i, n) for (int i = n; i >= 1; i --)
  10. # define REP_G(i, x) for (int i = pos[x]; i; i = g[i].frt)
  11. # define FOR(i, a, b) for (int i = a; i <= b; i ++)
  12. # define DWN(i, a, b) for (int i = b; i >= a; i --)
  13. # define RST(a) memset (a, 0, sizeof (a))
  14. # define CLR(a, x) memset (a, x, sizeof (a))
  15. # define CPY(a, b) memcpy (a, b, sizeof (a))
  16. # define NR 201000
  17. struct Edge {int y, frt; void Set (int _y, int _frt) {y = _y, frt = _frt;}} g[NR << 1];
  18. int pos[NR], gsz, dsz, bg[NR], ed[NR], ro[NR], tsz, dep[NR], fa[NR], n, m, q0, __depb[NR];
  19. inline void AE (int x, int y) {g[++ gsz].Set (y, pos[x]), pos[x] = gsz;}
  20. inline int depMax (int a, int b) {return dep[a] < dep[b] ? b : a;}
  21. # define u t[x]
  22. # define o t[y]
  23. # define lc ch[0]
  24. # define rc ch[1]
  25. # define ulfc t[u.lc]
  26. # define urtc t[u.rc]
  27. struct Seg
  28. {
  29. int ch[2], tag;
  30. inline void Max (int w) {tag = depMax (tag, w);}
  31. inline void clean () {lc = rc = tag = 0;}
  32. } t[8001000];
  33. void segMfyMax (int &x, int l, int r, int ml, int mr, int w, int y)
  34. {
  35. x = ++ tsz; u = o;
  36. if (ml <= l && r <= mr) {u.Max (w); return ;}
  37. int mid = (l + r) >> 1;
  38. if (ml <= mid) segMfyMax (u.lc, l, mid, ml, mr, w, o.lc);
  39. if (mr > mid) segMfyMax (u.rc, mid + 1, r, ml, mr, w, o.rc);
  40. }
  41. int segQuery (int x, int l, int r, int p, int cur)
  42. {
  43. if (!x) return cur;
  44. cur = depMax (cur, u.tag);
  45. if (l == r) return cur;
  46. int mid = (l + r) >> 1;
  47. if (p <= mid) return segQuery (u.lc, l, mid, p, cur);
  48. return segQuery (u.rc, mid + 1, r, p, cur);
  49. }
  50. # define v g[i].y
  51. void dfsSeq (int x)
  52. {
  53. bg[x] = ++ dsz;
  54. REP_G (i, x) if (v != fa[x]) dep[v] = dep[x] + 1, fa[v] = x, dfsSeq (v);
  55. ed[x] = dsz;
  56. }
  57. void dfsPre (int x, int fa)
  58. {
  59. segMfyMax (ro[x], 1, n, bg[x], ed[x], x, ro[fa]);
  60. REP_G (i, x) if (v != fa) __depb[v] = __depb[x] + 1, dfsPre (v, x);
  61. }
  62. int main ()
  63. {
  64. dep[0] = -1;
  65. while (scanf ("%d%d", &n, &m) != EOF)
  66. {
  67. dsz = tsz = 0; int t1, t2, lst = 0;
  68. RST (pos), gsz = 0;
  69. FOR (i, 2, n) scanf ("%d", &t1), AE (t1, i);
  70. dfsSeq (1);
  71. RST (pos), gsz = 0;
  72. FOR (i, 2, n) scanf ("%d", &t1), AE (t1, i);
  73. dfsPre (1, 0);
  74. REP (i, m)
  75. {
  76. scanf ("%d%d", &t1, &t2), t1 = (t1 + lst) % n + 1, t2 = (t2 + lst) % n + 1;
  77. lst = segQuery (ro[t2], 1, n, bg[t1], 0), printf ("%d %d %d\n", lst, dep[t1] - dep[lst] + 1, __depb[t2] - __depb[lst] + 1);
  78. }
  79. REP (x, tsz) u.clean ();
  80. }
  81. return 0;
  82. }

ASC02 F Roads

调了一天发现是LCA写错了…………
考虑ci是花在第i条边上的代价。
显然有wiciwj+cji为树边,j为非树边)。
可以转化为二分图最大权匹配的对偶问题解决……

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <algorithm>
  4. using namespace std;
  5. # define REP(i, n) for (int i = 1; i <= n; i ++)
  6. # define REP_D0(i, n) for (int i = n - 1; i >= 0; i --)
  7. # define FOR(i, a, b) for (int i = a; i <= b; i ++)
  8. # define RST(a) memset (a, 0, sizeof (a))
  9. # define CLR(a, x) memset (a, x, sizeof (a))
  10. # define NR 410
  11. struct Edge {int y, frt, w; void Set (int _y, int _frt, int _w) {y = _y, frt = _frt, w = _w;}} __g[NR << 1];
  12. int pos[NR], gsz, g[NR][NR], lx[NR], __tw[NR], ly[NR], match[NR], lack, N, dep[NR], f[NR][10], fa[NR], fi[NR], n, m;
  13. bool visx[NR], visy[NR];
  14. const int inf = 1 << 30;
  15. inline void AE (int x, int y, int z) {__g[++ gsz].Set (y, pos[x], z), pos[x] = gsz;}
  16. template <class T0, class T1> inline bool RlxN (T0 &a, T1 b) {if (a > b) return a = b, true; return false;}
  17. template <class T0, class T1> inline bool RlxX (T0 &a, T1 b) {if (a < b) return a = b, true; return false;}
  18. # define v __g[i].y
  19. void DFS (int x)
  20. {
  21. f[x][0] = fa[x];
  22. for (int i = 1; (1 << i) <= dep[x]; i ++)
  23. f[x][i] = f[f[x][i - 1]][i - 1];
  24. for (int i = pos[x]; i; i = __g[i].frt) if (v != fa[x]) fa[v] = x, fi[v] = i >> 1, dep[v] = dep[x] + 1, DFS (v);
  25. }
  26. inline int LCA (int x, int y)
  27. {
  28. if (dep[x] < dep[y]) swap (x, y);
  29. REP_D0 (i, 10) if (dep[f[x][i]] >= dep[y]) x = f[x][i];
  30. if (x == y) return x;
  31. REP_D0 (i, 10) if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
  32. return f[x][0];
  33. }
  34. bool Find (int x)
  35. {
  36. visx[x] = true; int t;
  37. REP (y, N)
  38. {
  39. if (visy[y]) continue;
  40. t = lx[x] + ly[y] - g[x][y];
  41. if (t == 0)
  42. {
  43. visy[y] = true;
  44. if (match[y] == -1 || Find (match[y])) return match[y] = x, true;
  45. }
  46. else RlxN (lack, t);
  47. }
  48. return false;
  49. }
  50. void KM ()
  51. {
  52. RST (lx), RST (ly), CLR (match, -1);
  53. REP (i, N) REP (j, N) RlxX (lx[i], g[i][j]);
  54. REP (x, N)
  55. {
  56. while (true)
  57. {
  58. RST (visx), RST (visy), lack = inf;
  59. if (Find (x)) break;
  60. REP (i, N)
  61. {
  62. if (visx[i]) lx[i] -= lack;
  63. if (visy[i]) ly[i] += lack;
  64. }
  65. }
  66. }
  67. }
  68. int main ()
  69. {
  70. scanf ("%d%d", &n, &m), gsz = 1, dep[0] = -1;
  71. int t1, t2, t3;
  72. REP (i, n - 1) scanf ("%d%d%d", &t1, &t2, &t3), AE (t1, t2, t3), AE (t2, t1, t3);
  73. DFS (1);
  74. FOR (i, n, m)
  75. {
  76. scanf ("%d%d%d", &t1, &t2, &t3), __tw[i] = t3;
  77. int z = LCA (t1, t2);
  78. for (int x = t1; x != z; x = fa[x]) RlxX (g[fi[x]][i], __g[fi[x] << 1].w - t3);
  79. for (int x = t2; x != z; x = fa[x]) RlxX (g[fi[x]][i], __g[fi[x] << 1].w - t3);
  80. }
  81. N = m, KM ();
  82. REP (i, n - 1) printf ("%d\n", __g[i << 1].w - lx[i]);
  83. FOR (i, n, m) printf ("%d\n", __tw[i] + ly[i]);
  84. return 0;
  85. }

9.21 月曜日

TCO13 Round 2A 1000 ThePowers

TCO12 Wildcard 1000 StringSequence

DP题对着题解写代码有毛用…………
…………先考虑A为空串的情形。
令插入B[i,j)的方案数为F(i,j)
将串S中相同的连续的字母缩成一段,显然在某一段的任意位置插入该段的字母都是等价的。
为了避免重复我们强制只能在段末尾插入。

F(i,j)=ik<j,BkBjF(i,k)F(k+1,j)(ji1ki)

考虑串A不为空的情形时,我们令g[i][j]为串A匹配到i,串B匹配到j时的方案数。

g[i+1][k]+=(ki1ji)F(j+1,k)g[i][j]

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <string>
  4. # include <cassert>
  5. # include <algorithm>
  6. # include <iostream>
  7. using namespace std;
  8. # define REP(i, n) for (int i = 1; i <= n; i ++)
  9. # define REP_0(i, n) for (int i = 0; i < n; i ++)
  10. # define FOR(i, a, b) for (int i = a; i <= b; i ++)
  11. # define CLR(a, x) memset (a, x, sizeof (a))
  12. const int P = 1000000007;
  13. # define NR 60
  14. class StringSequences
  15. {
  16. private:
  17. int f[NR][NR], g[NR][NR], bi[NR][NR], n, m;
  18. char Sa[NR], Sb[NR];
  19. int F (int i, int j)
  20. {
  21. if (i == j) return 1;
  22. int &s = f[i][j];
  23. if (s != -1) return s;
  24. s = 0;
  25. FOR (k, i, j - 1) if (Sb[k] != Sb[j]) s = (s + 1ll * F (i, k) * F (k + 1, j) % P * bi[j - i - 1][k - i]) % P;
  26. return s;
  27. }
  28. public:
  29. int countSequences (string _A, string _B)
  30. {
  31. m = _A.length ();
  32. n = _B.length ();
  33. CLR (f, -1);
  34. REP (i, m) Sa[i] = _A[i - 1];
  35. REP (i, n) Sb[i] = _B[i - 1];
  36. bi[0][0] = 1;
  37. REP (i, n)
  38. {
  39. bi[i][0] = 1;
  40. REP (j, i)
  41. {
  42. bi[i][j] = bi[i - 1][j - 1] + bi[i - 1][j];
  43. if (bi[i][j] >= P) bi[i][j] -= P;
  44. }
  45. }
  46. m ++;
  47. n ++;
  48. g[0][0] = 1;
  49. REP_0 (i, m)
  50. FOR (j, i, n)
  51. FOR (k, j + 1, n)
  52. {
  53. if (Sa[i + 1] != Sb[k]) continue;
  54. g[i + 1][k] = (g[i + 1][k] + 1ll * g[i][j] * F (j + 1, k) % P * bi[k - i - 1][j - i]) % P;
  55. }
  56. return g[m][n];
  57. }
  58. };

9.22 火曜日

TCO13 Round 2C 1000 WellTimedSearch

ASC02 H Tickets

写道暴力Polya写的像傻逼一样…………

  1. import java.util.*;
  2. import java.io.*;
  3. import java.math.*;
  4. public class Main
  5. {
  6. public static void main (String[] args)
  7. {
  8. try
  9. {
  10. BufferedReader input = new BufferedReader (new FileReader ("tickets.in"));
  11. BufferedWriter output = new BufferedWriter (new FileWriter ("tickets.out"));
  12. String str = input.readLine ();
  13. int a = 0, b = 0;
  14. boolean aComplete = false;
  15. for (int i = 0; i < str.length (); i ++)
  16. {
  17. char c = str.charAt (i);
  18. if (c == ' ') aComplete = true;
  19. else if (Character.isDigit (c))
  20. {
  21. if (aComplete) b = b * 10 + Character.digit (c, 10);
  22. else a = a * 10 + Character.digit (c, 10);
  23. }
  24. }
  25. output.write ((new Solver ()).solve (a, b).toString ());
  26. output.flush ();
  27. input.close ();
  28. output.close ();
  29. }
  30. catch (IOException e)
  31. {
  32. System.out.println ("File not found!");
  33. }
  34. }
  35. }
  36. class Solver
  37. {
  38. private int n, m;
  39. private static boolean[] vis = new boolean[420];
  40. private int poi (int x, int y) {return x * m + y;}
  41. private int count (int[] p)
  42. {
  43. int result = 0;
  44. Arrays.fill (vis, 0, p.length, false);
  45. for (int i = 0; i < n * m; i ++)
  46. if (!vis[i])
  47. {
  48. result ++;
  49. vis[i] = true;
  50. for (int j = p[i]; j != i; j = p[j])
  51. vis[j] = true;
  52. }
  53. return result;
  54. }
  55. public BigInteger solve (int _n, int _m)
  56. {
  57. n = _n;
  58. m = _m;
  59. BigInteger answer = BigInteger.valueOf (0);
  60. int[][] p;
  61. int cnt = 0;
  62. if (n == m) p = new int[4][n * m];
  63. else p = new int[2][n * m];
  64. for (int i = 0; i < n; i ++)
  65. for (int j = 0; j < m; j ++)
  66. {
  67. for (int x = 0; x < n; x ++)
  68. {
  69. for (int y = 0; y < m; y ++)
  70. {
  71. int _x = (x + i) % n, _y = (y + j) % m;
  72. p[0][poi (x, y)] = poi (_x, _y);
  73. p[1][poi (x, y)] = poi (n - _x - 1, m - _y - 1);
  74. if (n == m)
  75. {
  76. p[2][poi (x, y)] = poi (m - _y - 1, _x);
  77. p[3][poi (x, y)] = poi (_y, n - _x - 1);
  78. }
  79. }
  80. }
  81. for (int _p[] : p)
  82. {
  83. answer = answer.add (BigInteger.valueOf (1).shiftLeft (count (_p)));
  84. cnt ++;
  85. }
  86. }
  87. return answer.divide (BigInteger.valueOf (cnt));
  88. }
  89. }

TCO 2013 Round 2B LitPanels

【Battle of Mocosor Day 7 Scene 1】
Noranz: 长官!今天有没有新的作战计划啊?
Dasen: ……没有…………还是强攻……
Noranz: 这样呀……那就继续上吧!
Dasen: ……这小子倒是真有活力呢…………

Infan: 长官!……发现西侧一支敌军魔法连队!有近百人!……
Dasen: …………别急,我去请示。

Dasen: Sergan大人,我军阵地西侧发现敌军一支魔法连队,是否进行攻击?
Sergan: 那就去啊!
Dasen: 我方实力不足进攻,请求支援。
Sergan: 知道了,立刻去进攻吧!我会联系支援的!

9.23 水曜日

TCO 2013 Round 3A TrickyInequality

【Battle of Mocosor Night 7】
浑浊的雨不停地冲击着地面……洗刷着地面上的斑斑血迹。
Dasen: 还没有攻下来呢……Sergan大人……
Sergan: 敌人已经在崩溃的边缘了。
Dasen: 长官,恕我直言……我们几次进攻都被毫不费力地挡下来了……
Sergan: 我知道。Dasen,这一仗至关重要,一定可以胜利的。
Dasen: 长官……伤亡已经……
Sergan: ……我知道了,你先回去吧。
Dasen: ……

Sergan: 今日停止夜战,大家回去休整吧。

Infan: Fiya!我在这里!…………伤势怎么样…………
Fiya: 没事的。
Infan: 去找过军医了?
Fiya: 没有。
Infan: 你怎么老是这样啦……来,我带你去找军医,不然伤口要感染的。
Fiya: ……

Infan: 喂,Fiya,军医在那里啊!喂,你要去哪?
Fiya: ……有人来了呢……
Fiya: ……咦……

TCO 2013 Semifinal 1 GameWithTree

9.24 木曜日

TCO 2013 Semifinal 2 OneBlack

TCO 2013 Round 3B ToastJumping

【Battle of Mocosor Night 8】

Falsytza: 战斗怎么样了啊。
Dasen: 先生,谢谢您!…………已经基本解决了……那个,我们的长官希望能认识您……
Falsytza: ……这种指挥的话还是免了吧。
Dasen: …………那个………………哎!…………Sergan长官!……
Falsytza: ……
Sergan: 十分感谢您对我们的帮助,很高兴认识您,请问您贵姓?
Falsytza: …………有事先告辞了。
Sergan: ……

Sergan: 去休息吧……
Dasen: 是……

Fiya: 你要去哪。
Falsytza: …………不知道。
Fiya: 留下来吧。
Falsytza: 为什么要留下我?
Fiya: 看着我。
Falsytza: ……为什么我要留下?
Fiya: 因为你无处可去。
Falsytza: ……你在哪个连队?
Fiya: 他的。

Falsytza: 听着,如果你的部队还想活下来,趁早离开那个家伙。
Dazen: ……可是离开他我们又能去哪里呢…………
Falsytza: 跟我走。
Dazen: ……可是…………
Falsytza: ……你还不知道你们附近有多少敌人?
Dazen: …………Seral,过来……附近有多少敌人…………说实话…………什么?!
Falsytza: 所以你们还觉得那家伙能带着你们活着出去?
Dazen: ……走!…………我走…………

TCO 2013 Finals TBlocks

9.25 金曜日

TCO 2013 Wildcard SemiMultiple

金曜日的早安~
完结撒花啦w 赶上了太太改二的日子呢哟~www
被虐的神志不清啦……要去休息休息啦……

9.26 土曜日

9.27 日曜日

9.28 月曜日

CF240F TorCoder

显然用一个线段树维护区间出现次数就好……

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cassert>
  4. # include <iostream>
  5. # include <algorithm>
  6. using namespace std;
  7. # define REP(i, n) for (int i = 1; i <= n; ++ i)
  8. # define REP_0(i, n) for (int i = 0; i < n; ++ i)
  9. # define REP_D0(i, n) for (int i = n - 1; i >= 0; -- i)
  10. # define max(a, b) ((a) > (b) ? (a) : (b))
  11. # define NR 100100
  12. int n, m, cur, sz, infol[NR], infor[NR], __root;
  13. char s[NR];
  14. inline int isc (int l0, int r0, int l1, int r1) {return max (0, min (r0, r1) - max (l0, l1) + 1);}
  15. struct Info
  16. {
  17. int cnt[26];
  18. void apply (Info tag, int l, int r, int _l, int _r)
  19. {
  20. int _m = (_l + _r - 1) >> 1, p = _l, s = -1;
  21. REP_0 (i, 26)
  22. {
  23. if (tag.cnt[i] % 2 == 1) s = i;
  24. tag.cnt[i] >>= 1;
  25. cnt[i] = isc (l, r, p, p + tag.cnt[i] - 1);
  26. p += tag.cnt[i];
  27. }
  28. if (s != -1)
  29. {
  30. if (l <= p && p <= r) cnt[s] ++;
  31. p ++;
  32. }
  33. REP_D0 (i, 26)
  34. {
  35. cnt[i] += isc (l, r, p, p + tag.cnt[i] - 1);
  36. p += tag.cnt[i];
  37. }
  38. assert (p == _r + 1);
  39. }
  40. } info[NR];
  41. # define u t[x]
  42. # define lc ch[0]
  43. # define rc ch[1]
  44. # define ulfc t[u.lc]
  45. # define urtc t[u.rc]
  46. struct Seg
  47. {
  48. int ch[2], cov; Info w;
  49. inline void cover (int _v, int l, int r) {w.apply (info[_v], l, r, infol[_v], infor[_v]), cov = _v;}
  50. } t[NR << 2];
  51. inline void push (int x, int l, int r) {if (!u.cov) return ; int mid = (l + r) >> 1; ulfc.cover (u.cov, l, mid), urtc.cover (u.cov, mid + 1, r), u.cov = 0;}
  52. inline void upd (int x) {REP_0 (i, 26) u.w.cnt[i] = ulfc.w.cnt[i] + urtc.w.cnt[i];}
  53. inline void count (int x, int l, int r, int cl, int cr)
  54. {
  55. if (cl <= l && r <= cr) {REP_0 (i, 26) info[cur].cnt[i] += u.w.cnt[i]; return ;}
  56. push (x, l, r); int mid = (l + r) >> 1;
  57. if (cl <= mid) count (u.lc, l, mid, cl, cr);
  58. if (cr > mid) count (u.rc, mid + 1, r, cl, cr);
  59. }
  60. bool check (int l, int r)
  61. {
  62. count (__root, 1, n, l, r);
  63. bool odd = false;
  64. REP_0 (i, 26) if (info[cur].cnt[i] % 2 == 1) {if (!odd) odd = true; else return false;}
  65. return true;
  66. }
  67. void modify (int x, int l, int r, int ml, int mr)
  68. {
  69. if (ml <= l && r <= mr) {u.cover (cur, l, r); return ;}
  70. push (x, l, r); int mid = (l + r) >> 1;
  71. if (ml <= mid) modify (u.lc, l, mid, ml, mr);
  72. if (mr > mid) modify (u.rc, mid + 1, r, ml, mr);
  73. upd (x);
  74. }
  75. int build (int l, int r)
  76. {
  77. int x = ++ sz, mid = (l + r) >> 1;
  78. if (l == r) {++ u.w.cnt[s[l] - 'a']; return x;}
  79. return u.lc = build (l, mid), u.rc = build (mid + 1, r), upd (x), x;
  80. }
  81. void output (int x, int l, int r)
  82. {
  83. if (l == r) {REP_0 (i, 26) if (u.w.cnt[i] > 0) putchar (i + 'a'); return ;}
  84. push (x, l, r); int mid = (l + r) >> 1; output (u.lc, l, mid), output (u.rc, mid + 1, r);
  85. }
  86. int main ()
  87. {
  88. scanf ("%d%d%s", &n, &m, s + 1);
  89. int t1, t2; __root = build (1, n);
  90. REP (i, m)
  91. {
  92. scanf ("%d%d", &t1, &t2), ++ cur, infol[cur] = t1, infor[cur] = t2;
  93. if (check (t1, t2)) modify (__root, 1, n, t1, t2);
  94. }
  95. output (__root, 1, n);
  96. return 0;
  97. }

CF241D Numbers

能不能不天天爆OJ啊哭……

可以发现它给的两个条件毫不相关。
我们把它给的两个条件看作两个函数,子序列异或和为0在只考虑大小在O(logn)之内元素的时候就有远大于p种情况了。那么大概可以知道,直接暴力取大小在O(logn)之内的元素就可以了。

  1. # include <cstdio>
  2. # define REP(i, n) for (int i = 1; i <= n; i ++)
  3. # define REP_D(i, n) for (int i = n; i >= 1; i --)
  4. bool vis[33][33][50010];
  5. int n, m, P, li[100], len, a[100], id[50010], dig[100];
  6. bool DFS (int i, int j, int k)
  7. {
  8. if (i > n) return !j && !k;
  9. if (vis[i][j][k]) return false;
  10. vis[i][j][k] = true;
  11. if (DFS (i + 1, j, k)) return true;
  12. if (DFS (i + 1, j ^ a[i], (k * dig[a[i]] + a[i]) % P)) return li[++ len] = a[i], true;
  13. return false;
  14. }
  15. bool solve () {REP (i, n) if (DFS (i + 1, a[i], a[i] % P)) {li[++ len] = a[i]; return true;} return false;}
  16. int main ()
  17. {
  18. scanf ("%d%d", &m, &P); int t1;
  19. REP (i, 31) dig[i] = i < 10 ? 10 : 100;
  20. REP (i, m) {scanf ("%d", &t1); if (t1 < 32) id[a[++ n] = t1] = i;}
  21. if (solve ()) {printf ("Yes\n%d\n", len); REP_D (i, len) printf ("%d ", id[li[i]]);}
  22. else puts ("No");
  23. return 0;
  24. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注