4.30晚
NO.1 来源:[ZJOI2015] 地震后的幻想乡
分类: dp, 概率与期望
简要题解:
orzorzorz
题解看这里
5.1上午
NO.2 来源: BZOJ 4456 [Zjoi2016]旅行者
分类: 分治
简要题解:
- 离线处理询问,分治平面区域。
- 每次分治处理某一维坐标(范围较小的递归下去),下面讨论递归处理
y
,讨论
x 的情形。假设现在平面区域是 (x1,y1)→(x2,y2) 。当然最开始是 (1,n)→(1,m) - 显然平面被 l:x=(x1+x2)/2 这条直线分成两个区域,起点和终点不跨越两边的询问递归处理。跨越两边的一定在 l 上有一个中转点。
- 所以枚举
l 这条线上 y∈[y1,y2] 的所有点,跑一边dijkastra,用它更新所有询问的答案。 - 递归处理
x
,讨论
y 是一样的方法。
反思
- 最短路问题一般都是抓住图的一些特殊性质来处理。比如仙人掌图,就是抓住了和树的相似性
- 这个题的做法其实有点像最近点对的分治做法。
5.1 下午
NO.3 来源:BZOJ 4869:[Shoi2017]相逢是问候
分类: 数学 暴力
简要题解:
- 设
Φ(x,i)
表示对
x
求
i 次欧拉函数后的结果。存在一个 y 使得i>y 时 Φ(x,i) 恒为1。不难发现 y 是log(x) 级别的。记 y=lim(x) - 考虑 cca 这种形式,显然只有前面的 lim(p) 层指数是有用的,后面的都是1.
- 所以对于一个点都是可以 O(log(p)) 计算的,并且一个点最多操作 lim(p) 次变成一个定值
- 用一个类似线段树的结构剪枝,暴力计算即可。每一个区间维护一个 times(x) ,表示这个区间更改最少的数被操作的次数,那么 time(x)≥lim(p) 时这个区间就完全不用修改了。
反思
- 对于同余式a^b≡x(mod m),如何求出x?
注意到b很大,我们可以先采取一些方法降幂。
- 若 gcd(a,m)=1 ,那么使用欧拉定理即可: ab≡ab mod φ(m) (mod m)
- 若
gcd(a,m)>1
,且
b>φ(m)
,则有“求幂大法”——
ab≡ab mod φ(m)+φ(m)(mod m)
5.1晚
NO.4 : BZOJ 4870 [Shoi2017]组合数问题
分类: 组合数学 DP 矩阵乘法
简要题解:
- 考虑所求式子的实际意义,即从
n∗k
个物品中选出 模
k
等于
r 的数量的物品的方案数。 - 设
f(i,j)
表示
i
个物品中选出模
k 等于 j 的数量的物品的方案数。 f(i,j)=f(i−1,j)+f(i−1,(j−1) mod k ), f(0,0)=1 - 注意到 0≤r<k≤50 ,显然可以矩阵乘法优化,时间复杂度为 O(k3log(n∗k)) 。
反思
- 组合计数有时候要注意实际意义。
- 有限阶 递推的式子 要想到多项式乘法和矩阵乘法。
- 注意矩阵乘法不满足交换律。
5.2 晚
NO.6 : BZOJ 4868 [Shoi2017]期末考试
分类: 三分求函数极值
简要题解:
- 显然最后的代价只和最后的结束时间有关,设最后结束的时间为
x
时代价为
f(x) -
f(x)
显然可以贪心的
O(n)
计算:
- A>=B 时,全部用操作2来调整。
- A<B 时,尽量用操作1来平衡,再用操作2调整。
- 最后加上等待的代价即可。注意数据中有 C 极大的情况(即不能等待),需要特判。
- 那么枚举
x 的 O(n2) 的算法就很显然了,60分。 - f(x) 是单峰函数,三分求一下极小值就可以了。至于为什么,只能去感受一下。。。
反思
- 函数思想,找到正确的自变量,事情就做了一半。
- 如何计算函数值。
研究函数的性质,单峰,凹凸性等等。
5.2 晚
NO.7: 【ZJOI 2012 DAY2】灾难
分类: 树 LCT
简要题解:
- orzorzorz fanhq666
- 题解
反思
- 其实好像并不用LCT,直接倍增一是可以的,就当复习了。
- 涨姿势:LCT中, Access(x) 最后的 prev 节点代表的意义是当前的 preferred_path 和之前的 preferred_path 深度最大的公共点。根据这个性质,LCA可以这样求:
int Access(int x){
int pre=0;
while(x){
splay(x); ch[x][1]=pre; Maintain(x);
pre=x; x=fa[x];
}
return pre;
}
int LCA(int x,int y,int Root){ //返回以Root为根的时候的LCA(x,y)
SetRoot(Root);
Access(x);
return Access(y);
}
5.3晚
NO.8 :BZOJ 4455: [Zjoi2016]小星星
分类: 三分求函数极值
简要题解:
- 考虑容斥原理,令
g(S)
表示树上的每个点对应
S
集合中的一个点(可重复)的方案数。那么
ans=∑(−1)n−|S|∗g(S) - 枚举
S
,问题转化为计算
g(S) 。考虑树形DP,令 f(x,i) 表示 x 号节点对应S 中的第 i 个元素的方案数,设0 号点为树根。那么:g(S)=∑i=1|S|f(0,i) f(x,i)=∏v∈son(x) ∑j=1,i→j有边|S|f(v,j)
反思
计数问题一定要考虑容斥原理。
5.4晚
NO.9 : BZOJ 4573 [Zjoi2016]大森林
分类: LCT
简要题解:
- 考虑离线,对第
i
个改变生长点的操作,建立一个辅助点
xi 。辅助点点权为0,其他点权值为1. xi→xi+1连上边 - 对
[l,r]
这些树 的修改可以用差分的思想,拆成两个小动作:
在讨论第 l 棵树 的时候修改,在讨论第r+1 棵树的时候 恢复。 - 当一个改变生长点的操作
i
当前不生效时,
xi 挂在 xi−1 下面时,但若其生效了,我们把它挂在其对应点下。 - 按照操作的 生效时间(第二关键字按照输入时间顺序)排序,修改总比询问优先。
反思
- 树上的距离要用 dist(x)+dist(y)−dist(lca(x,y)) .
link(x,y) 和 link(y,x) 是不一样的。
5.5上午
NO.10: BZOJ 4552 [TJOI2016] 排序
分类: 二分答案 线段树
简要题解:
- 由于只求一个位置的数,我们可以二分答案
x
,问题转化为最后
q 位置的数是否大于 x . - 把原来序列中
A[i]>x 的,令 a[i]=1 ,否则令 a[i]=0 . - 01序列上的排序可以转化为求区间和与区间修改。用线段树维护这个01序列,每次排序时间复杂度为
O(log(n))
,
m
次排序就是
O(mlog(n)) 。 - 最后如果 a[q]=0 表示 ans≤x , a[q]=1 表示 ans>x
- 总时间复杂度为 O(m∗log2(n))
反思
- 只求一个值,大小关系之类的应该想到二分答案。
貌似有 O((m+n)∗log(n)) 的方法,以后再说吧。
5.5下午
NO.11: BZOJ APIO2011 方格染色
分类: 位运算 并查集
简要题解:
- 如果把方格看成一个矩阵
an,m
题目的要求可以看成是
ai−1,j−1 xor ai−1,j xor ai,j−1 xor ai,j=1
- 进一步推导可以发现:
a1,j xor a1,j xor ai,1 xor ai,j=1(i,j均为偶数)否则:a1,j xor a1,j xor ai,1 xor ai,j=0 (∗)
- 我们把 i,j 均为偶数的 ai,j 取反,就统一成了 (∗) 关系。
- 那么给出的限制可以分成两种:
- 对 a1,i xor a1,j 的限制
- 对 a1,1 的限制
- 枚举 a1,1 ,我们以下讨论 a1,1=0 的情况。用并查集来维护变量的相关关系,每个点记录一个 f(x) 表示和父亲节点的关系(1表示相反,0表示相反)。最后的答案就是 2tot−1 , tot 是联通块的个数。
反思
- 两种取值,应该立刻想到用二进制和位运算来描述。
- 变量之间的关系可以看成图,可以考虑一些图算法。