Loading

[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\)的传统,在此不发代码。

posted @ 2022-12-14 21:31  zhouhuanyi  阅读(30)  评论(0)    收藏  举报