一些订题总结

文章探讨了在图论问题中如何灵活构建二分图以找到最小点覆盖,利用最大流算法处理最大贡献问题。对于GCD的计算,通过拆分因子并结合区间询问,提出使用莫队算法和二次离线优化。此外,转换曼哈顿距离为切比雪夫距离简化问题,并通过费用流解决最大值匹配。文章还介绍了如何通过模拟费用流在特定图模型中进行高效求解。
摘要由CSDN通过智能技术生成

修建城墙

Z 2494
有 L 和 T 两个部分分。
对于 L ,建立二分图求最小点覆盖的方法可能比较典。
一个点是,如何输出最小点覆盖的方案,对于与 S 相连的,取走不到的,与 T 相连的,取走的到的。
然后是 T 。
首先是建图上要灵活,对于 L ,更契合的是边的为点,对于 T,边为点的构图方式显然遇到了一些麻烦,于是尝试边为边。
比较重要的一点是转化贡献,分析一下可以知道要满足条件,每个方格都有一个至少的代价,而相邻方格之间可以有公共的代价,这重复的代价需要被剪掉,那么就要求使这个代价最大化,这个代价对应边,那么最大流即可。

比赛的时候主要是没有考虑到贡献怎么转化。

1.建图要灵活,边为点还是点为边要具体问题具体分析。
2.对于贡献的计算,可以考虑最坏情况下的总贡献,然后考虑可以尽可能多的减去重复或者不必要的贡献,贡献形式就变为一个最大贡献的常数-一个尽可能的大的数,可以最大流或者费用流之类的解决。

GCD

Z 2495
一个具有奠基性作用的一点是:把 g c d ( x , y ) gcd(x,y) gcd(x,y) 拆成 ∑ d ∣ x , y ϕ ( d ) \sum_{d|x,y}\phi(d) dx,yϕ(d) ,这样就由一个 gcd 问题变成了对每个因子计数出现多少次的问题。
由于有区间询问,对于数据较小的点,容易想到莫队,对移动区间时新增加的一个数考虑它对各因子数的贡献。这个东西复杂度是莫队加上每次新加上数时枚举因子的复杂度,比较爆炸。
进而,受这种思想的启发,发现,对于一个新加的数的贡献,除了每次重新枚举,可以对每次加入的数直接更新未来可能加入的数新增的贡献,这样当加入一个数时可以直接访问,O(1)更新。至于添加一个数对未来添加的数贡献的贡献,是可以离线的。
那么其实就是莫队二次离线的思路。
可以把贡献拆成前缀加减的形式,一个前缀再减去一个前缀把多余的贡献去掉,这样提前处理好每个前缀会对哪些询问有贡献,离线的时候在序列上从左到右扫一遍,得到前缀的值,然后对相应的询问答案加减就可以了。

比赛的时候没有往莫队二离上想。

算是个莫队二次离线的典的应用。
对于一个维护好的区间,新加的数的贡献摊到已经维护好的数的贡献,这个贡献可以变成两个前缀加减,然后就可以直接从左到右扫一般得到前缀值,更新相应的答案。

图论科技

Z 2501
一个点是曼哈顿距离与切比雪夫距离的转化
这里曼哈顿距离不好做,换成切比雪夫距离,就变成了一个取 max 的问题。

第二个点是,对于 max的处理,发现贡献是 max ⁡ ( ∣ x i − x j ∣ , ∣ y i − y j ∣ ) \max(|x_i-x_j|,|y_i-y_j|) max(xixj,yiyj) 的形式,而题目又求最大值,那么可以将每个点 i i i 的贡献拆成 x i , − x i , y i , − y i x_i,-x_i,y_i,-y_i xi,xi,yi,yi四个点的形式,由取 max 变成了若干种情况下的简单相加,这样就变成了匹配求最大值问题。
可以费用流解决。

第三个点是,发现图的模型较为简单,考虑模拟费用流
这里学到了一种新的模拟费用流形式,主要对于可以根据人类智慧把图规模缩的比较小的情况下。本质不变——反悔贪心。首先,该题的图主要是 S-左部点-x,-x,y,-y的四个贡献点-右部点-T,对于部点对贡献点的边维护时可以直接变为由源汇点向贡献点的边,这样图的规模就只有 6 了。用堆和spfa 维护,先不考虑反悔边,用spfa 贪心跑出一条最大路径,那么可以得到一对左右(x,y)的匹配点,对于 x ,和 y ,把所有原来建的非反悔边删去(这里可以打标记用懒惰删除法处理),然后认为建出反悔边,注意反悔贡献的变化。这样对于这道题有 n 对匹配,用 spfa 跑 n 次就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值