A(数据结构:区间更新、查询最值线段树)
大致题意:给定n个闭区间,求两个点,使包含这两个点的总数最多
题解:
很明显是离散化后用数据结构维护,想了个先找被包含区间数最大的点,去掉该点后找第二个点的错误贪心
正解:首先,我们规定,选取的第一个点始终位于第二个点的左侧。
离散化后将所有区间按左端点从大到小排列,再从大到小用i枚举点,将所有左端点大于i的区间加入,记录此时的最大值作为f[i],则此时f[i]表示不包含左端点小于等于i的区间的情况下,能找到一个点,满足包含这个点的最多的区间数。
当所有区间都加入后,用i遍历所有点,f[i]+包含i的区间总数则为可能答案
证明:包含i的区间总数很好理解,即枚举第一条直线的位置,而f[i]则表示消除包含该条直线后的区间后,第二条直线能达到的最大区间数(其他区间要么对答案根本没贡献—完全位于i点左侧,要么包含i)
1 |
|
这个线段树写法是硬改的。。不怎么优雅,而且常数很大
B(图论、Floyd)
题意:给定m个物品,n个人对所有物品进行喜好度分级(可能多个物品同一级),先规定d(x,y)为比起y更喜欢x的人数,现有路径,满足条件d(t,t+1)>d(t+1,t)(即路径中相邻两项中,比起右项更喜欢左项的人数要严格大于比起左项更喜欢右项的人数),在所有d(t,t+1)中,取最小值作为S(x,y)的预备值,在所有预备值中,取最大值作为S(x,y),若不存在路径,则规定S(x,y)=0,若S(x,y)>=S(y,x),当y为除了x的任意值时,都成立,则输出x,要求找出所有x(m<500,n<500)
题解:
图论题,用d[x,y]存储比起y更喜欢x的人数后,将所有不能形成路径的d消去(避免影响后续计算),类似Floyd算法,规定dp[k,x,y]表示x、y之间路径不包含编号超过k的节点时,S(x,y)的最大值,当k=0时,dp[0,x,y]=d[x,y]/(前提是d[x,y]有意义,即能形成路径),之后枚举k进行计算,得到S值,再枚举所有S值得到答案。
1 |
|
E(二分+贪心)
题意:给定n组数据(x,y),根据题意求出误差最小值
题解:小数二分误差值,check使用贪心
check具体流程:将所有点按x坐标从左到右排好之后,先找到pos满足pos前的所有值都小于等于给定值,之后到达第二阶段;易知同一分段内的最大值最小值之差不能大于2给定值,根据最大最小值更新第二阶段可能的最小值,直至不满足条件,将其作为pos;之后所有点都归为第三个分段,而第三个分段满足的条件是:1.最大值、最小值之差不能大于2给定值2.最小值+给定值必须大于第二阶段值
1 |
|