[Ynoi2010]iepsmCmq
链接:https://www.luogu.com.cn/problem/P6105
题目描述:维护一个集合,动态加删元素,每一次维护集合中\((i+j)modC\)(\(i,j\)是集合中两个不同的元素)的最大值。
题解:我们可以将原问题转化为两个子问题:
\(1\).求\(i+j<C\)的\(i+j\)的最大值。
\(2\).求\(i+j>C\)的\(i+j-C\)的最大值。
事实上第二类问题在第一类问题的前提下可化为求\(i+j-C\)的最大值,可以用\(set\)直接维护。
考虑第一个问题,将每一个元素\(i\)按\(i<C/2\)与\(i>=C/2\)划分成两个集合\(A,B\),则贡献就有两种情况。
\(1\).\(A\)与\(A\)的贡献:可以将\(A\)中最大的两个元素相加作为答案,可以用\(set\)直接维护。
\(2\).令在\(A\)中取一个\(i\),在\(B\)中取一个\(j\),则\(i+j<C\),可化为\(i<C-j\),考虑两类集合元素的贡献:
\(A\)集合:实际上就是求\(i\)在\(C-j\)的集合中的后继。
\(B\)集合:实际上就是求\(C-j\)在\(A\)集合中的前驱。
可以将\(C-j\)看作集合\(D\),由于加删元素至多会变化一个元素的后继,前驱对答案的贡献,所以可以用一个堆与\(set\)维护。
由于要保持\(Ynoi\)的传统,在此不发代码。
本文来自博客园,作者:zhouhuanyi,转载请注明原文链接:https://www.cnblogs.com/zhouhuanyi/p/16983650.html

浙公网安备 33010602011771号