2019雅礼集训day2 题解

这篇博客详细解析了2019年雅礼集训的算法题目,涉及线段树解决树上问题、点分治处理括号匹配以及构造二分图求最大费用可行流。对于T1,通过建立线段树实现了O(nlogn)的时间复杂度解法;T2中,利用点分治和FFT优化计算,达到O(nlog^2n)的复杂度;T3通过构造二分图并运用最大费用可行流找到最优解。
摘要由CSDN通过智能技术生成

T1 two

在这里插入图片描述
n ≤ 2 × 1 0 5 n\leq 2\times 10^5 n2×105

题意真的很难懂。。。

简而言之就是有两棵树,每次求对于其中一棵树 A A A的一条边 ( p , q ) (p,q) (p,q)(设 p p p q q q的父亲,即 q q q p p p子树内),在另一棵树 B B B上的边 ( x , y ) (x,y) (x,y)(设 x , y x,y x,y A A A d f s dfs dfs序满足 d f n [ x ] &lt; d f n [ y ] dfn[x]&lt;dfn[y] dfn[x]<dfn[y]),且满足 A A A中的两个点分别在 p p p的子树内和子树外。

实际上只有两种情况:

  • i n [ p ] ≤ d f n [ x ] ≤ o u t [ p ] , o u t [ p ] &lt; d f n [ y ] in[p]\leq dfn[x]\leq out[p],out[p]&lt;dfn[y] in[p]dfn[x]out[p],out[p]<dfn[y]
  • d f n [ x ] &lt; i n [ p ] , i n [ p ] ≤ d f n [ y ] ≤ o u t [ p ] dfn[x]&lt;in[p],in[p]\leq dfn[y]\leq out[p] dfn[x]<in[p],in[p]dfn[y]out[p]

考虑对于两棵树分别建立两颗线段树。
第一颗以 d f n [ x ] dfn[x] dfn[x]为下标,按 d f n [ y ] dfn[y] dfn[y]递增插入。第二颗以 d f n [ y ] dfn[y] dfn[y]为下标,按 d f n [ x ] dfn[x] dfn[x]递减插入。每个节点 v e c t o r vector vector储存下标区间对应边的另一端(第一颗是 d f n [ y ] dfn[y] dfn[y],第二颗是 d f n [ x ] dfn[x] dfn[x])。

每次查找相当于删去 v e c t o r vector vector末端的一段。直接线性扫指针,每条边存在于 log ⁡ n \log n logn个节点中,所以时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)


T2 bracket

在这里插入图片描述
n , m ≤ 5 × 1 0 4 n,m\leq 5\times 10^4 n,m5×104

点分治,记录每个点 i i i到分治重心 x x x的前缀 S i S_i Si(’(‘等价于1,’)'等价于-1)。

考虑一个合法点对 ( i , j ) (i,j) (i,j)( i i i走到 j j j,设分治重心为 x x x),则必然 S i + S j = 0 S_i+S_j=0 Si+Sj=0,且 S i S_i Si i i i x x x路径上的最大值, S j S_j Sj j

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值