思维有点辣鸡,一题都想不出来,只能一鼓作气三题暴力了,第三题的50分暴力还打错了,真是蠢
T1
有N家洗车店从左往右排成一排,每家店都有一个正整数价格Pi。
有M个人要来消费,第i个人会驶过第Ai个开始一直到第Bi个洗车店,且会选择这些店中最便宜的一个进行一次消费。但是如果这个最便宜的价格大于Ci,那么这个人就不洗车了。
请给每家店指定一个价格,使得所有人花的钱的总和最大。
我们应当想到他具有区间可合并性,只需要处理横跨两个区间的人就可以了。
所以区间DP,设f[l,r,k]为现在已经处理到了区间[l,r],其中最小值为k的答案。k只需要离散化一下就可以了。
不难知道
其中g表示,有g[i,j]个人横跨了i这个位置,且这j个人的上限都大于等于j。
T2
现在你有N个数,分别为A1,A2,…,AN,现在有M组询问需要你回答。每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K(1<=K<=N,不存在输出-1)满足以下两个条件:
①能够在原来的N个数中选出不重复(下标不重复)的K个数,使得这K个数的和在区间[L,R]内。
②能够在原来的N个数中选出不重复(下标不重复)的K个数,使得这K个数的和不在区间[L,R]内。
首先题目给出了一个蜜汁条件
保证Max{Ai}-Min{Ai}<=R-L
我们应该通过这个条件得出,值相邻的选k个的方案间隔必定小于R-L。
就相当于求 和在l之前方案 的最大k1取值(显然是按小到大取最优),与直线在l之后的最小k2的取值
1..k1,k2..n重叠的那一部分就意味着是取k个的最小方案与最大方案是两线分居的,这样必定有解。其余情况必定无解。
对于r同理。
T3
我们应当注意到区间的可合并性,线段树维护一个区间[l,r]的左边连续个数与右边连续个数等11个值,pascal打上10000byte,c++打4000byte即可ac此题。