csp-s55 (雅礼day 5)
我押bao了。。。
T1线段树打+调了3小时26分钟。。。。。。
4分钟puts("-1")+puts("0")
T1发现离散化后原节点+1处稍难处理(然后开了4个数组两个树状数组。。。没调出来。)
直接塞进离散化数组了完事,,,然后线段树懒标记1->2,2->1部分脑抽写成了^=1, 然后它正好变成了3。。。
T1线段树
关键点:1.离散化塞进去l[i]+1,r[i]+1
2.懒标记的冲突解决主要是3遇到了3,1,2;
3.这种懒标记不同于sum可以累加所以到x<=l&&r>=y 时如果有懒标记先下传
T2贪心
关键点:1.读题读对(至少k个)
2.一共可以分成4类集合直接贪心不可情况及后效性复杂
3.因此考虑把某种难以考虑的情况影响最大的集合固定下来(枚举啊),主要影响的其实在于两个人同时喜欢的集合了枚举这里选多少就可以了
然后对每个集合贪心既然枚举选了r个那么一二集合中均需选出至少k-r 个同样贪心+前缀和(sort后的)
最后考虑m个的限制,不够的话从还未选的里挑出m-(2*k-r)个最小的,
可以再开一种把只有一个喜欢的和无人喜欢的塞进去这时要从里面选x个还得不包含已经选了的(k-r)和(k-r)个
考虑它们一定再各自的种类中排在前面,对大集合预处理扫一遍记录每种的个数,最后二分判断能否即可
4.注意题面的恰好选m个所以如果(k-r)+(k-r)+r>m 情况不符合 continue
5.各种-1的判断细节
T3 集合+bitset+倒推
考虑每个苹果要留下来必须删去哪些而
那些一定只能为了留下它而被删去,这一性质是这道题的关键
eg. x y z
q k x
要留下z那么到time=3时x必须还在,那么time=1时删去的必须是q
可以发现每个点有明确的时间限制 所以它不可能为了两个点牺牲
eg. x y z t
q k x x
要留下t z
那么x必须在time=4时还留下着,time=3时被删去二者冲突
所以倒着推回去算出到目前为止的集合表示的是到目前为止必须留下的及到最后必须干掉的
所以推完表示开始时必须留下的==到最后必须删了的
最后n^2枚举判断s[i] & s[j] ==0 说明不冲突可行
当然中途可能有 情况使得无论怎样都不合法 即这个点最后是不可能留的了 不参与最终的判断 一个mark数组即可
复杂度O(n^2*m/32);
好题 性质题