【学习笔记】数据结构

其实没有什么主题但是总想写点文字水一下

今天状态不是很好

Sanae and Giant Robot

  • 2500 的评分低了吧 。
  • 对于以 i i i 结尾的子段,定义 p [ i ] p[i] p[i] 表示最大的使得 ∑ j = p [ i ] i a i = ∑ j = p [ i ] i b i \sum_{j=p[i]}^ia_i=\sum_{j=p[i]}^ib_i j=p[i]iai=j=p[i]ibi 的位置
  • 对于一个操作 [ l , r ] [l,r] [l,r] ,相当于任意 l ≤ i ≤ r l\le i\le r lir p [ i ] = i p[i]=i p[i]=i
  • 注意到每个位置最多只会操作一次
  • 事实上考虑 i → p [ i ] − 1 i\to p[i]-1 ip[i]1 ,操作 [ l , r ] [l,r] [l,r] 合法当且仅当端点在一个并查集当中
  • 考虑怎么修改 。把所有 p [ i ] ≠ i p[i]\ne i p[i]=i 的点拎出来,令 i → i − 1 i\to i-1 ii1
  • 可以 set 维护。
  • 怎么判断一个操作可做了呢,用启发式合并 。
  • 具体可能要用队列模拟一下 。
  • 因为合并的复杂度和插入的复杂度是独立的,所以总时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 做法是伪的,除非有可撤销的并查集
  • c i = ∑ i = 1 n ( a i − b i ) c_i=\sum_{i=1}^n(a_i-b_i) ci=i=1n(aibi)
  • 操作 [ l , r ] [l,r] [l,r] 合法当且仅当 c r = c l − 1 c_r=c_{l-1} cr=cl1 ,然后区间 [ l , r ] [l,r] [l,r] 全部赋成 c l − 1 c_{l-1} cl1
  • 目标是让 c c c 数组清零
  • 观察到 题解的做法是 c l − 1 = c r ≠ 0 c_{l-1}=c_r\ne 0 cl1=cr=0 时,一定不优
  • 证明不难。考虑最后一次 c l − 1 = c r ≠ 0 c_{l-1}=c_r\ne 0 cl1=cr=0 的情况,在这之后一定操作的都是两段为 0 0 0 的端点,显然这次操作是冗余的
  • 初始将 c i = 0 c_i=0 ci=0 的点 rua 进队列,时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 这个转化太妙了,给出题人点赞 !

Diverse Segments

  • 假设我们知道了删除区间 [ l , r ] [l,r] [l,r]
  • [ l , r ] [l,r] [l,r] 抹去,考虑不同的值 a i a_i ai ,设集合 { p i } \{p_i\} {pi} 并构造若干区间 [ p i , p i + 1 ] [p_i,p_{i+1}] [pi,pi+1]
  • 这样对于每个询问区间 [ l , r ] [l,r] [l,r] 只要包含任意上述构造区间就不合法
  • 对于构造的每个区间 [ p i , p i + 1 ] [p_i,p_{i+1}] [pi,pi+1] 可以求出有多少个询问区间包含它
  • 可以用主席树维护
  • 使用 two-pointers 能做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)

Closest Pair

  • 讲个笑话,我连一组询问都不会做
  • 这题是假询问
  • L [ i ] L[i] L[i] 表示 i i i 左边满足 w [ j ] ≤ w [ i ] w[j]\leq w[i] w[j]w[i] 的最大的点, R [ i ] R[i] R[i] 表示 i i i 右边满足 w [ j ] ≤ w [ i ] w[j]\leq w[i] w[j]w[i] 的最小的点
  • 结论是 题解的做法是 最终答案的形式一定是 ( L [ i ] , i ) , ( i , R [ i ] ) (L[i],i),(i,R[i]) (L[i],i),(i,R[i])
  • 证明是不难的 虽然晚自习梦游但还是证出来了
  • 我来浅证一下(
  • 假设存在 ( i , j ) (i,j) (i,j) 最优,满足 L [ j ] ≠ i , R [ i ] ≠ j L[j]\ne i,R[i]\ne j L[j]=i,R[i]=j
  • w [ i ] ≤ w [ j ] w[i]\le w[j] w[i]w[j]
  • 在数轴上 i < L [ j ] < j ii<L[j]<j
  • 因为 i i i L [ j ] L[j] L[j] 优,所以 w [ i ] ≤ w [ L [ j ] ] ≤ w [ j ] w[i]\le w[L[j]]\le w[j] w[i]w[L[j]]w[j]
  • 所以 ( i , L [ j ] ) (i,L[j]) (i,L[j]) ( i , j ) (i,j) (i,j)
  • w [ i ] > w [ j ] w[i]>w[j] w[i]>w[j]
  • 在数轴上 i < R [ i ] < j ii<R[i]<j
  • 因为 j j j R [ i ] R[i] R[i] 优,所以 w [ i ] ≥ w [ R [ i ] ] ≥ w [ j ] w[i]\ge w[R[i]]\ge w[j] w[i]w[R[i]]w[j]
  • 所以 ( R [ i ] , j ) (R[i],j) (R[i],j) ( i , j ) (i,j) (i,j)
  • 实在想不出来 motivation 了
  • 毋宁称之为构造题吧
  • 然后树状数组 O ( n log ⁡ n ) O(n\log n) O(nlogn) 直接 rua 过去 这个多组询问就是逊啊
  • 代码写不写都无所谓 反正没事就写吧

Tokitsukaze and Beautiful Subsegments

  • cf 评分 2900
  • 好好的数据结构为什么要套数学
  • 显然问题可以转化成 n ln ⁡ n n\ln n nlnn 个权值为 1 1 1 的矩阵
  • 并且矩阵之间没有重复
  • 询问也可以转化为求矩阵的和
  • 把修改和询问都拆开,离线后再用树状数组维护即可 。
  • 时间复杂度 O ( q log ⁡ n ) O(q\log n) O(qlogn)

Perfect Matching

  • 先颓一会再说

欧拉回路和图的连通性

简单 dp

线段树

*数据结构

你可能感兴趣的:(总结,学习)