5月题目汇总1 (4.30-5.6)

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 ,那么使用欧拉定理即可: abab mod φ(m) (mod m)
    • gcd(a,m)>1 ,且 b>φ(m) ,则有“求幂大法”——
      abab mod φ(m)+φ(m)(mod m)

5.1晚

NO.4 : BZOJ 4870 [Shoi2017]组合数问题

分类: 组合数学 DP 矩阵乘法
简要题解:
  • 考虑所求式子的实际意义,即从 nk 个物品中选出 模 k 等于 r 的数量的物品的方案数。
  • f(i,j) 表示 i 个物品中选出模k 等于 j 的数量的物品的方案数。
  • f(i,j)=f(i1,j)+f(i1,(j1) mod k ),  f(0,0)=1
  • 注意到 0r<k50 ,显然可以矩阵乘法优化,时间复杂度为 O(k3log(nk))
反思
  • 组合计数有时候要注意实际意义。
  • 有限阶 递推的式子 要想到多项式乘法和矩阵乘法。
  • 注意矩阵乘法不满足交换律。

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
简要题解:
反思
  • 其实好像并不用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)=vson(x) j=1,ij|S|f(v,j)
反思
  • 计数问题一定要考虑容斥原理。


    5.4晚

NO.9 : BZOJ 4573 [Zjoi2016]大森林

分类: LCT
简要题解:
  • 考虑离线,对第 i 个改变生长点的操作,建立一个辅助点xi。辅助点点权为0,其他点权值为1. xixi+1
  • [l,r] 这些树 的修改可以用差分的思想,拆成两个小动作:
    在讨论第 l 棵树 的时候修改,在讨论第r+1 棵树的时候 恢复。
  • 当一个改变生长点的操作 i 当前不生效时,xi挂在 xi1 下面时,但若其生效了,我们把它挂在其对应点下。
  • 按照操作的 生效时间(第二关键字按照输入时间顺序)排序,修改总比询问优先。
反思
  • 树上的距离要用 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 表示 ansx , a[q]=1 表示 ans>x
  • 总时间复杂度为 O(mlog2(n))
反思
  • 只求一个值,大小关系之类的应该想到二分答案。
  • 貌似有 O((m+n)log(n)) 的方法,以后再说吧。


    5.5下午

NO.11: BZOJ APIO2011 方格染色

分类: 位运算 并查集
简要题解:
  • 如果把方格看成一个矩阵 an,m 题目的要求可以看成是
    ai1,j1 xor ai1,j xor ai,j1 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表示相反)。最后的答案就是 2tot1 , tot 是联通块的个数。
反思
  • 两种取值,应该立刻想到用二进制和位运算来描述。
  • 变量之间的关系可以看成图,可以考虑一些图算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值