[关闭]
@Falsyta 2015-08-09T07:21:58.000000Z 字数 1549 阅读 1213

mxh带窝打多校之Contest 6

OI mxh带窝飞


约定

对于两个字符串a,bab表示ab首尾相接得到的串。
对于两个字符串s,SsS表示sS的子串。

题意

窝严重怀疑ZJU的审美呀………………
出题人还不标数据组数呀w
感觉做起来并不是很开心呢。

1002 Bipartite Graph

给定一个无向图G={V,E},对于1i|V|,删除i号点后的图是否是二分图。

1006 First One

给出非负数列A,定义lg0=0,求

i=1Nj=iN(i+j)lgk=ijAk+1

1010 Just A String

定义可以通过重新排列字符变成回文串的字符串为好串。
求字符集为M长度为N的随机串的期望好子串个数。

题解

1002 Bipartite Graph

由于点的问题不容易解决,考虑将问题转化到边上。
维护一个无向图G={V,E},支持:
1. 向图中插入边(x,y)
2. 询问当前图是否是二分图。
然后就变成原题了。
用分治+并查集即可。

1006 First One

由于A是非负数列所以固定i时,jk=iAk是单调的。
对数的取值只有O(lgW)种,因此对于每种取值维护当i一定时取该值的j的区间即可。
时间复杂度O(NlgW)

1010 Just A String

先介绍低端的做法。
考虑F(i,j)为长度为i出现次数为奇数的字符有j种的方案数,显然有
F(i,j)=(j+1)F(i1,j+1)+(Mj+1)F(i1,j1)
然后枚举每种长度的子串统计贡献即可。
时间复杂度O(Nmin(N,M))
卡常数呀w

  1. # include <cstdio>
  2. # include <algorithm>
  3. using namespace std;
  4. # define REP(i, n) for (int i = 1; i <= n; i ++)
  5. # define REP_0N(i, n) for (int i = 0; i <= n; i ++)
  6. const int NR = 2020;
  7. const int P = 1000000007;
  8. int f[NR][NR], inv[NR];
  9. int Pow (int a, int z) {int s = 1; do {if (z & 1) s = 1ll * s * a % P; a = 1ll * a * a % P;} while (z >>= 1); return s;}
  10. int pw[2010][2010];
  11. int main ()
  12. {
  13. f[0][0] = 1;
  14. REP (i, 2000)
  15. {
  16. pw[i][0] = 1;
  17. REP (j, 2000) pw[i][j] = 1ll * pw[i][j - 1] * i % P;
  18. }
  19. int n, m, q0;
  20. for (scanf ("%d", &q0); q0; q0 --)
  21. {
  22. scanf ("%d%d", &n, &m);
  23. int ans = 0;
  24. REP (i, n)
  25. {
  26. int len = min (m, i);
  27. f[i][0] = f[i - 1][1];
  28. f[i][len + 1] = f[i][len + 2] = f[i][len + 3] = 0;
  29. REP (j, len) f[i][j] = (1ll * (j + 1) * f[i - 1][j + 1] + 1ll * (m - j + 1) * f[i - 1][j - 1]) % P;
  30. }
  31. REP (i, n) ans = (ans + 1ll * (n - i + 1) * pw[m][n - i] % P * (f[i][0] + f[i][1])) % P;
  32. printf ("%d\n", ans);
  33. }
  34. return 0;
  35. }

高端做法写完再说好啦。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注