BZOJ 水题50乱做

Edit Posted on 23 9 月, 2016

正在整理以前的老博客内容

BZOJ虽然已经不在了,但是我们会永远怀恋它的

文章目录

1051: [HAOI2006]受欢迎的牛

显然受欢迎的牛一定在一个强连通分量里,缩点后看看有没有出度为0的点,如果有多个那么无解。

4690: Never Wait for Weights

加权并查集。

1269: [AHOI2006]文本编辑器editor

rope 的使用方法:http://blog.csdn.net/iamzky/article/details/38348653

1031: [JSOI2007]字符加密Cipher

后缀数组裸题。

3238: [Ahoi2013]差异

后缀数组裸题。

1041: [HAOI2008]圆上的整点

数学题,求 a2+b2=c2a^2+b^2=c^2a2+b2=c2(c 已知)时 a, b 的正整数解个数。

参考:http://blog.csdn.net/csyzcyj/article/details/10044629

1014: [JSOI2008]火星人prefix

splay + hash + 二分。

1069: [SCOI2007]最大土地面积

平面土地上有 N 个点,选择其中的四个点,求围成的多边形最大面积,n≤2000n \le 2000n≤2000。

求凸包,O(n2)O(n^2)O(n2) 枚举对角线,两侧的点有决策单调性,用一个指针 O(1)O(1)O(1) 求。

1090: [SCOI2003]字符串折叠

区间 dp。

3998: [TJOI2015]弦论

SAM。


1066: [SCOI2007]蜥蜴

网络流,拆点。

1015: [JSOI2008]星球大战starwar

倒着并查集。

4443: [Scoi2015]小凸玩矩阵

网络流,动态加边 / 二分都行。

1067: [SCOI2007]降雨量

线段树 / RMQ 都行,要分类讨论。

1042: [HAOI2008]硬币购物

我们先算出不考虑限制时的方案数 fsf_sfs,如果一个硬币超出限制,那么至少要使用 di+1d_i+1di+1 次,此时答案为 fs−ci⋅(di+1)f_{s-c_i \cdot (d_i+1)}fs−ci⋅(di+1),我们可以用容斥定理解决问题。

2298: [HAOI2011]problem a

考虑一个人的话:"有 aia_iai 个人分数比我高,bib_ibi 个人分数比我低"等价于"我的排名在 [L,R][L, R][L,R] 区间中,这个区间中人的成绩相同",然后就可以变成线段覆盖问题,贪心即可。

4653: [Noi2016]区间

将区间按长度排序,枚举最长区间长度,显然最短区间长度满足单调性,只需要确认"m 个区间共同包含至少一个位置",用线段树维护最大值即可。

1192: [HNOI2006]鬼谷子的钱袋

k 个钱袋最多能凑出 2k−12^k-12k−1 的所有钱数。

1800: [Ahoi2009]fly 飞行棋

暴力。

1856: [Scoi2010]字符串

回顾卡特兰数的推导过程,发现 ans=C(n+m,n)−C(n+m,n+1)ans = C(n+m, n) - C(n+m, n+1)ans=C(n+m,n)−C(n+m,n+1)。


1801: [Ahoi2009]chess 中国象棋

炮的攻击范围为:横行竖行,跳过一个棋子打一个,距离不限。

故原题为求 n×mn \times mn×m 的矩阵中同行同列只能放至多 2 个炮的方案数。

fi,j,kf_{i,j,k}fi,j,k 表示到第 i 行,j 列放了一个,k 列放了 2 个的方案数。

4641: 基因改造

在允许置换的情况下 KMP 是可以的,hash 应该也行。

我觉得我应该改改 KMP 的模板了......

4602: [Sdoi2016]齿轮

dfs 走一遍。

3926: [Zjoi2015]诸神眷顾的幻想乡

由于叶子节点不超过 20 个,所以可以用 SAM。

注意拷贝叶子节点时只拷贝 c 个节点不然会 TLE。

4627: [BeiJing2016]回转寿司

线段树裸题。

4619: [Wf2016]Swap Space

贪心,证明看得不是很懂。

参考:http://www.cnblogs.com/gangding/p/5705400.html

1016: [JSOI2008]最小生成树计数

回忆 Kruskal 的建立方法,显然每个长度后图的连通性是一定的,具有相同权值的边不会超过 10 条,dfs 就行。

1061: [Noi2008]志愿者招募

经典的问题。

参考:https://www.byvoid.com/blog/noi-2008-employee/

3295: [Cqoi2011]动态逆序对

cdq,三维偏序(白书原题)。

3996: [TJOI2015]线性代数

经过一堆变形我们发现

ans=∑i=1n∑j=1nBi,jaiaj−∑i=1nCiaians = \sum_{i=1}^{n} \sum_{j=1}^{n} B_{i,j} a_i a_j - \sum_{i=1}^{n} C_i a_ians=i=1∑nj=1∑nBi,jaiaj−i=1∑nCiai

我们把这转化为最大权闭合子图最小割。

答案 = 所有点正权值之和 - 最小割。

3875: [Ahoi2014]骑士游戏

令 fif_ifi 为杀死 i 的最小代价,那么有

fi=min⁡(Ki,∑vfvi)f_i = \min\left(K_i, \sum_v f_{v_i}\right)fi=min(Ki,v∑fvi)

状态之前的转移有环,我们考虑《SPFA 算法的优化及应用》中提到的算法。


3997: [TJOI2015]组合数学

安利 Dilworth 定理:http://blog.csdn.net/popoqqq/article/details/45171469

4448: [Scoi2015]情报传递

询问离线,树链剖分。

1070: [SCOI2007]修车

费用流经典模型。

参考:http://www.cnblogs.com/Sky-Grey/p/3862019.html

4418: [Shoi2013]扇形面积并

扫描线,用树状数组 + 二分判断。

1406: [AHOI2007]密码箱
x2≡1(modn)x^2 \equiv 1 \pmod{n}x2≡1(modn) 等价于 n∣(x−1)(x+1)n \mid (x-1)(x+1)n∣(x−1)(x+1),然后暴力枚举因子就行。

1038: [ZJOI2008]瞭望塔

半平面交,把分段点(包括边界)取出来。

2618: [Cqoi2006]凸多边形

拆成一堆直线半平面交。

4517: [Sdoi2016]排列计数

错排公式:D(0)=1, D(1)=0, D(i)=(i−1)(D(i−1)+D(i−2))D(0)=1,\ D(1)=0,\ D(i)=(i-1)(D(i-1)+D(i-2))D(0)=1, D(1)=0, D(i)=(i−1)(D(i−1)+D(i−2))

有个求一段阶乘的逆元的小技巧:

cpp 复制代码
for (inv[n] = pow2(fact[n], F-2, F), i = n-1; i; i--)
    inv[i] = mul(inv[i+1], i+1);

4516: [Sdoi2016]生成魔咒

  1. 裸 SAM + map
  2. 求出反序后字符串的 SA,每次添加一个字符串,考虑其对 height 前后字符串的影响

4514: [Sdoi2016]数字配对

我们发现两个数能配对,则它们分解质因子后的数的个数奇偶性不同,我们可以建出二分图,费用流乱搞。


2243: [SDOI2011]染色

树链剖分,把情况转成子节点到父节点的两条链会比较好讨论。

3531: [Sdoi2014]旅行

树链剖分,拆成 n 棵树。记得动态开点减少结点数。

3631: [JLOI2014]松鼠的新家

对于加法操作差分,将对链的操作转换为点始末节点的操作,避免后效性。在子节点 sis_isi +1 表示从它开始到根节点均 +1,最后统计一遍就行。

4034: [HAOI2015]T2

树链剖分时,可用 dfs 序剖分:

cpp 复制代码
void dfs(int x, int fa, int tp) {
    top[x] = tp;
    id[x] = ++cnt;
    if (son[x]) dfs(son[x], x, tp);
    Forp(x) {
        int v = edge[p];
        if (v == fa || v == son[x]) continue;
        dfs(v, x, v);
    }
    mx[x] = cnt;
}

3626: [LNOI2014]LCA

操作离线,然后:

后加每个点的时候是把从这个点到根的路径的点权全部 +1,

然后查询就是查询某个点到根的路径的点权和。

1191: [HNOI2006]超级英雄Hero

二分图匹配。

1143: [CTSC2008]祭祀river

用 floyd 求传递闭包,建图,原题求最长反链 = 最小链覆盖。

证明:http://www.bubuko.com/infodetail-664202.html

  • 路径不能相交的最小路径覆盖可以用二分图做。
  • 路径可以相交的最小路径覆盖(也就是最小链覆盖)可以用 floyd 求传递闭包建图,转成前面那个用二分图做。

2227: [Zjoi2011]看电影(movie)

公式题:

ans=(k+1)n−1⋅(k−n+1)knans = \frac{(k+1)^{n-1} \cdot (k-n+1)}{k^n}ans=kn(k+1)n−1⋅(k−n+1)

神一般的证明:http://www.cnblogs.com/devilpi/articles/3817691.html

1179: [Apio2009]Atm

tarjan 缩点 + 跑一遍 dij。

4419: [Shoi2013]发微博

用户没有传递性(SB 读错题),只有直接关系能看到信息。

差分后得到 ansi=t2−t1+t3−t4+...+tn−tn−1ans_i = t_2 - t_1 + t_3 - t_4 + \ldots + t_n - t_{n-1}ansi=t2−t1+t3−t4+...+tn−tn−1,暴力维护。