2023年 7月 做题记录

文章详细探讨了几种算法问题,包括如何通过位操作处理区间覆盖,动态规划解决不导致终止局面的期望选择次数,以及利用图算法求解复杂问题。重点在于转换问题和优化复杂度,如将覆盖操作转化为加减操作,以及分析树形结构对选择次数的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

乐,7.9 才开始写.

LOJ #6507. 「雅礼集训 2018 Day7」A

考场做法

按位考虑.
对于 & & 操作,为 1 1 1 的位不需要考虑.对于为 0 0 0 的位,则是 [ l , r ] [l,r] [l,r] 的这一位覆盖为 0 0 0 ∣ | 操作同理.
因为是某一位的覆盖,不能方便地维护全局的最小值.

考虑将覆盖操作换成加减操作.
对于任意一位:遍历 [ l , r ] [l,r] [l,r],若干极长的 0 / 1 0/1 0/1 段可以一起操作(加,减或不变),操作之后区间被统一成 1 1 1 0 0 0.我们发现复杂度是颜色段覆盖.

正解

不用按位考虑了.
考虑维护区间的 ∣ | S o r S_{or} Sor & \& & S a n d S_{and} Sand

  1. 对于一个区间,只有 S o r S_{or} Sor S a n d S_{and} Sand 进行操作后相等,才能保证区间中的每个数进行操作后相等.
  2. 对于一个区间 ∣ d |d d,若 s a n d ∣ d = s o r ∣ d s_{and}|d=s_{or}|d sandd=sord,则区间 ∣ d |d d 无效.
  3. 对于一个区间 & d \&d &d,若 s a n d & d = s o r & d s_{and}\&d=s_{or}\&d sand&d=sor&d,则区间 & d \&d &d 无效.

根据势能分析可以知道算法复杂度正确.

但我不会势能分析.

LOJ #6508. 「雅礼集训 2018 Day7」B

奇妙的转化.

考虑枚举 T i T_i Ti,然后看它能贡献到以哪些地方为起点的询问上.

考虑起点是 p p p

T i = 1 T_i=1 Ti=1
S i + p ‾ ≡ [ 0 , c ) S p ‾ ≡ [ 0 − i a , c − i a ) \overline {S_{i+p}} \equiv [0,c)\\ \overline {S_p} \equiv [0-ia,c-ia) Si+p[0,c)Sp[0ia,cia)

T i = 0 T_i=0 Ti=0
S i + p ‾ ≡ [ c , n ) S p ‾ ≡ [ c − i a , n − i a ) \overline {S_{i+p}} \equiv [c,n)\\ \overline {S_p} \equiv [c-ia, n-ia) Si+p[c,n)Sp[cia,nia)

T i T_i Ti 有贡献的起点 p p p S p S_p Sp 是剩余类上一个连续区间.

整一个动态开点值域线段数即可.

LOJ #6509. 「雅礼集训 2018 Day7」C

很强的随机性伴随的对称性.

考虑转化贡献.
发现一个点被选择后,若没有到终止局面,肯定会进行下一次选择:产生的移动距离期望是
∑ v ∈ [ 1 , n ] d i s ( u , v ) n \frac{\sum_{v\in[1,n]}dis(u,v)}{n} nv[1,n]dis(u,v)
那么我们只需要求出每个点不导致终止局面的期望被选择次数即可.
由于纯随机,发现树的形态不会对选择次数产生影响.

考虑设计状态 F i , 0 / 1 F_{i,0/1} Fi,0/1 表示存在 i i i 个黑点,其中任意一个 黑/白 点不导致终止局面的期望被选择次数.

有转移方程
F i , 1 = i − 1 n F i − 1 , 1 + n − i n F i + 1 , 1 + 1 n ( F i − 1 , 0 + 1 ) F_{i,1}=\frac{i-1}{n}F_{i-1,1}+\frac{n-i}{n}F_{i+1,1}+\frac{1}{n}(F_{i-1,0}+1) Fi,1=ni1Fi1,1+nniFi+1,1+n1(Fi1,0+1)
F i , 0 = i n F i − 1 , 0 + n − i − 1 n F i + 1 , 0 + 1 n ( F i + 1 , 1 + 1 ) F_{i,0}=\frac{i}{n}F_{i-1,0}+\frac{n-i-1}{n}F_{i+1, 0}+\frac{1}{n}{(F_{i+1,1}+1)} Fi,0=niFi1,0+nni1Fi+1,0+n1(Fi+1,1+1)

笔者尝试实现暴力高斯消元.但答案一直不对.
这里附上一篇不错的题解 20200525 hz T3(#6509. 「雅礼集训 2018 Day7」C)【期望】

P7831 [CCO2021] Travelling Merchant

考虑如下算法流程:

(1) 对于图中没有出度的(在队列中)点,更新指向它们的点并将指向它们的边删除,将这些点压入队列.如果产生了新的没有度数的点,则重复该流程.
(2) 选出没有被删除的 r r r 最大的边,假设它是 e ( u → v , r , p ) e(u \rightarrow v,r,p) e(uv,r,p).用 r r r 更新 u u u 的答案.若 u u u 没有出度,将 u u u 压入队列.
(3)重复上面两步操作,直到所有边被删除.

以上算法的时间复杂度瓶颈在给边按 r r r 降序排序.

考虑算法的正确性.

显然从 u u u 出发,要保证无限游走必须要走到一个环上.

算法每次将可能在环上的最大边断掉(2),然后使用类似拓扑排序的方法更新可能在这个环上的点的答案(1).

分两类:

  • 若环上 r r r 最大的边在从 u u u 指出的边上.算法步骤(2)可以更新.
  • 若环上 r r r 最大的边不是从 u u u 指出的边上.算法步骤(1)可以更新.

LOJ #6065. 「2017 山东一轮集训 Day3」第一题

分类枚举.
n u m ( l e n ) num(len) num(len) 表示长度为 l e n len len 的木棍的个数.

  1. 两条长度为边长的木棍 + + + 四条小木棍.先枚举边长,然后枚举四条木棍.答案为
    ∑ l e n ( n u m ( l e n ) 2 ) w ( l e n )   \sum_{len}\binom{num(len)}{2}w(len)\ len(2num(len))w(len) 
    这里的 w ( l e n ) w(len) w(len) 表示用四条木棍组成两条长为 l e n len len 的边的方案数量.这个方案是容易讨论的.
  2. 三条长度为边长的木棍 + + + 三条小木棍.这时不能先枚举边长(处理会变得很麻烦).存在两根小木棒相同或三根小木棒都相同的情况是容易解决的.考虑三根小木棒均不同如何统计.枚举三条小木棍中最长的一个.从大到小扫描每种长度的木棍.记 F i , j F_{i,j} Fi,j 表示长度 ≤ i \le i i 的两根木棍拼起来,大小等于 j j j 的方案数.新加入长度为 i i i 的小木棍后, F F F 存在变化 F i , i + j + = n u m ( i ) ∗ n u m ( j ) F_{i,i+j}+=num(i)*num(j) Fi,i+j+=num(i)num(j).然后这时,我们再枚举边长 d d d,由于规定了最长的小木棍为 i i i,则对方案的贡献为
    ( n u m ( d ) 4 ) n u m ( i ) F i , d − i \binom{num(d)}{4} num(i)F_{i,d-i} (4num(d))num(i)Fi,di

LOJ #6119. 「2017 山东二轮集训 Day7」国王

x x x 表示 u ∈ [ l , r ] u \in [l,r] u[l,r],记 y y y 表示 u ∉ [ l , r ] u \notin [l,r] u/[l,r]

那么一个区间 [ l , r ] [l,r] [l,r] 合法即判定
∑ ( x i , x j ) [ ( x i , x j )   i s   a   c o r r e c t   p a t h ] > ∑ ( y i , y j ) [ ( y i , y j )   i s   a   c o r r e c t   p a t h ] \sum_{(x_i,x_j)}[(x_i,x_j)\ is\ a\ correct\ path] > \sum_{(y_i,y_j)}[(y_i,y_j)\ is\ a\ correct\ path] (xi,xj)[(xi,xj) is a correct path]>(yi,yj)[(yi,yj) is a correct path]

考虑在不等式左边加上
∑ ( x i , y j ) [ ( x i , y j )   i s   a   c o r r e c t   p a t h ] \sum_{(x_i,y_j)}[(x_i,y_j)\ is\ a\ correct\ path] (xi,yj)[(xi,yj) is a correct path]
右边加上
∑ ( y i , x j ) [ ( y i , x j )   i s   a   c o r r e c t   p a t h ] \sum_{(y_i,x_j)}[(y_i,x_j)\ is\ a\ correct\ path] (yi,xj)[(yi,xj) is a correct path]
显然这两个部分是相等的.
那么原来的判定式可以改写成:
∑ ( x i , ∗ ) [ ( x i , ∗ )   i s   a   c o r r e c t   p a t h ] > ∑ ( y i , ∗ ) [ ( y i , ∗ )   i s   a   c o r r e c t   p a t h ] \sum_{(x_i,*)}[(x_i,*)\ is\ a\ correct\ path] > \sum_{(y_i,*)}[(y_i,*)\ is\ a\ correct\ path] (xi,)[(xi,) is a correct path]>(yi,)[(yi,) is a correct path]

2 ∑ ( x i , ∗ ) [ ( x i , ∗ )   i s   a   c o r r e c t   p a t h ] > ∑ ( ∗ , ∗ ) [ ( ∗ , ∗ )   i s   a   c o r r e c t   p a t h ] 2 \sum_{(x_i,*)}[(x_i,*)\ is\ a\ correct\ path] > \sum_{(*,*)}[(*,*)\ is\ a\ correct\ path] 2(xi,)[(xi,) is a correct path]>(,)[(,) is a correct path]

w i = ∑ ( i , ∗ ) [ ( i , ∗ )   i s   a   c o r r e c t   p a t h ] \displaystyle w_i=\sum_{(i,*)}[(i,*)\ is\ a\ correct\ path] wi=(i,)[(i,) is a correct path],求出所有 w i w_i wi 后双指针即可.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值