一句话题解集——口胡万岁
- P3205 [HNOI2010]合唱队
- P4513 小白逛公园
- P3431 [POI2005]AUT-The Bus
- P3052 [USACO12MAR]Cows in a Skyscraper G
- P2606 [ZJOI2010]排列计数
- CF1398E Two Types of Spells
- CF1271E Common Number
- P6098 [USACO19FEB]Cow Land G
- P4092 [HEOI2016/TJOI2016]树
- P2839 [国家集训队]middle
- CF438D The Child and Sequence
- P1438 无聊的数列
- P4588 [TJOI2018]数学计算
- CF343D Water Tree
- P2851 [USACO06DEC]The Fewest Coins G
- P5522 [yLOI2019 ] 棠梨煎雪
- P2949 [USACO09OPEN]Work Scheduling G
- P2085 最小函数值
- P2707 Facer帮父亲
- P4404 [JSOI2010]缓存交换
- P3599 Koishi Loves Construction
- P3514 [POI2011]LIZ-Lollipop
- P2569 [SCOI2010]股票交易
最近还是做了不少题的,但发现好久没写东西了,就打算把之前的题目随便口胡了得。发现神仙题还是蛮多的,慢慢更……
已经摆明是一句话题解了,所以一行一题很正常,不要见怪
主要给自己看的,其他人当题目推荐看得了
没有顺序,难度绿至黑(可能为恶评)
P3205 [HNOI2010]合唱队
算法:区间dp
容易发现每次一定从某一个数开始向左或右扩展。
那么设出dp方程:\(dp[l][r][0/1]\) 为扩展到区间 \([l,r]\) 最后一次是向左或右扩的方案数
如果 \(a[l]<a[l+1]\) 就可以从上一步向左扩展为 \([l+1,r]\) 扩展,即从 \(f[l+1][r][0]\) 扩展
如果 \(a[l]<a[r]\) 就可以从上一步向右扩展为 \([l+1,r]\) 扩展,即从 \(f[l+1][r][1]\) 扩展
同理 \(r\) 的情况
最后答案即为 \(f[1][n][1]+f[1][n][0]\)
P4513 小白逛公园
傻逼题,最大子段和,注意有个细节,询问有可能 \(x<y\) 。(卡了好久)
用来凑蓝题数的
P3431 [POI2005]AUT-The Bus
很容易想到的树状数组优化dp ,基础题。离散化+树状数组+dp
用来凑蓝题数的
P3052 [USACO12MAR]Cows in a Skyscraper G
港真,刚看到题傻了一下,以为是什么优化dp啥的,一看数据范围 \(n\leq 18\) ,好了,状压没跑了
最直接的想法是直接设 \(f[i]\) 表示当前状态为 $i $ 的最小分组数。
但想想转移,发现我们还要知道还剩的电梯空间,于是我们再记一个 \(g[i]\) 数组表示当前状态下最后一个电梯的剩余体积。因为状压dp是从部分转移到整体,所以不用考虑除最后一个电梯的其他电梯。
剩下转移十分简单,不多赘述
P2606 [ZJOI2010]排列计数
这题好像还不是很懂,以后补
CF1398E Two Types of Spells
模拟赛题,练数据结构,开了一个线段树,两个可删堆,轻松过了。
CF1271E Common Number
感觉挺神仙的,刚开始完全想不到
感觉一两句话讲不清啊,主要是分奇偶讨论,找性质,看看题解比较好
P6098 [USACO19FEB]Cow Land G
傻逼题,树剖板子,用来水蓝题的
P4092 [HEOI2016/TJOI2016]树
一个简单转化成树剖的题,权值为深度(打标记时再加),每次询问点到根的权值max,再来求编号。
用来水蓝题的
P2839 [国家集训队]middle
黑题\se 其实是这类题里一个套路,如果没做过这种套路题可能比较难想。
就是这种左右端点各在一个区间的题
还有就是区间中位数:二分一个答案mid,把所有>=mid的数值设成1,<mid的值设为-1
查询区间内的和是否>=0(这个题是>=0,题意中,偶数项的中位数是中间的那两个靠后的那一个)
是,中位数应该更大,否则,中位数只能更小。
但这题区间不确定,但无论如何区间 \([b+1,c-1]\) 是必选的
要让中位数尽可能大,\(1\)的数量要尽可能多
于是找区间 \([a,b]\) 的最大后缀和区间 \([c,d]\) 最大前缀
这两值再加上区间 \([b+1,c-1]\) 的和即为对于当前二分的中位数 \(mid\) 的最大的和,进行判断即可
但我们要对每一个二分的值 \(mid\) 都建一棵线段树。
线段树以区间下标为下标,记录区间和,区间最大后缀,最大前缀。
空间炸了。所以使用主席树
发现,对于mid变成mid+1,只有值为mid的数的值会从+1变成-1.
主席树在前者的基础上暴力修改。每一个数就会改一次,所以均摊logn空间。
是道好题,要好好研究!
CF438D The Child and Sequence
势能线段树板子,单点修改,不虚,没做过大概比较难想
参考区间开根
P1438 无聊的数列
线段树+差分。考虑将等差序列变为差分,就转化为区间加,查询区间和的问题了,线段树轻松维护
P4588 [TJOI2018]数学计算
zkw线段树乱搞(不大想写)
CF343D Water Tree
树剖板子,水题专用
P2851 [USACO06DEC]The Fewest Coins G
这是我模拟赛用的题,附上题解
以及接下来的两题
P5522 [yLOI2019 ] 棠梨煎雪
P2949 [USACO09OPEN]Work Scheduling G
P2085 最小函数值
单调队列板子,用来重温单调队列的
P2707 Facer帮父亲
单队,思维题
我们将收益表达出来是\(v = ax - bx^2\) 这是一个二次函数,在二次函数的对称轴之前函数单调递增但斜率不断变小,及\(x\)每增加\(1\)所增加的\(v\)会不断变小。因此我们将所有当前门票增加所增加的收益放进大根堆里,贪心每次加最大的那个,重新计算后加入堆。
P4404 [JSOI2010]缓存交换
贪心题,一时半会儿讲不清,以后补
P3599 Koishi Loves Construction
神仙题,思维题,我讲不清,看第一篇题解,讲得很好
P3514 [POI2011]LIZ-Lollipop
神仙题,思维题,刚看感觉很简单,但就是想不到。
我们考虑从值\(x\)的角度出发。有以下结论:
如果有一个子串和为x,那么一定有一个子串和为x-2
具体证明很简单,不多赘述
那么我们找出一个最大的可以构造出来的奇数和偶数,然后通过他们俩分别推出其他数的区间。对于一个数 \(x\) 用 \(l[x]\) 和 \(r[x]\) 分别表示组成 \(x\) 的区间左右端点。
整一个序列和是一个奇数或偶数,那么从左至右第一个\(1\)到最右的区间和为另一种的最大值(也可能为从右至左第一个\(1\)到最左的区间和),就那个意思,明白就好
之后对每一个询问 \(O(1)\) 输出即可。
P2569 [SCOI2010]股票交易
单调队列优化dp题
容易想到朴素dp状态:设 \(f[i][j]\) 为第 \(i\) 天后拥有 \(j\) 张股票可以赚到的最多钱数
分 \(4\) 种情况转移:以下方程自动取 \(max\)
1.凭本买,直接赋值:\(f[i][j]=-ap_i × j\)
2.不买不卖,直接由上一天转移:\(f[i][j]=f[i-1][j]\)
3.买股票,从 \(i-w-1\) 天转移过来,之所以不用从其它天,是因为情况 \(2\) 已经让 \(i-w-1\) 天继承了之前所有的最优情况 。还要再枚举一个 \(i-w-1\) 天拥有的股票数 \(k\) 。得到转移方程:\(f[i][j]=f[i-w-1][k]-(j-k)×ap_i\ \ (j-as_i\leq k < j)\)
4.卖股票,和\(3\)类似,转移方程为:\(f[i][j]=f[i-w-1][k]+(k-j)×bp_i\ \ (j<k\leq j+bs_i)\)
----分割线----
这样时间复杂度为 \(O(T×{MaxP}^2)\) ,不能通过本题,要使用单调队列优化
第\(3\)种情况方程可化为:\(f[i][j]=max(f[i][j],f[i-w-1]+k×ap_i)-j×ap_i\)
第\(4\)种情况方程可化为:\(f[i][j]=max(f[i][j],f[i-w-1]+k×bp_i)-j×bp_i\)
以上方程符合单调性优化条件,故使用单调性优化。
对了,还有一个细节,是第 3 种情况转移应该顺序,第 4 种情况转移应该逆序,这个不难理解,先自己想想吧。
代码还是要好好理解的,用来领悟单调队列不错的题。