首页 > 代码库 > 0708
0708
快退役了,赶快发挥一下剩余价值QWQ。
长郡集训第二场:
T1:小Y
首先给定一个排列,然后每次询问给定两个区间,问左边区间的所有排列中有多少可以恰好可以使得左边的每个数恰好小于右边的每个数。n,m<=100000,P的逆序对<=100000
暴力做法是把两个区间拎出来,放一起排序,然后从左到右扫,每次看当前右边区间的数还有多少左边区间的数可以选,乘起来。
然后我发现这个做法几乎没法优化,就放了,然后出题人说,暴力的数据范围只说了n<=1000,没说m的范围,暴力只有10分,出题人***。
正解的做法利用逆序对的限制,设Xi表示右边区间第i小的数比左边区间的多少个数要大。可以证明Xi的变化次数最多只有sqrt(n)次。
证明:思考若Xi变化次数超过了sqrt(N),那么可以发现如果把两个区间拎出来一起排序,那么会出现大于sqrt(N)次的左边区间的数-右边区间的数相邻的情况。
然后考虑一个右边区间的数会与他右边所有左边区间的数形成逆序对,然后发现若出现了这样的情况逆序对数目会超过N,然后可知Xi的变化次数不会超过sqrt(N)次。
对于一个Xi相同的区间,可以组合数维护,跳转Xi的区间可以使用可持久化线段树,没了。
复杂度:O(Msqrt(N)logN),能卡过1e5,也是醉了。
T2:暗牧
给出N个一毛一样的树,然后给定一些可以在这些树上穿越的路,要求两点最短路。数据范围全部1e5以上。
考虑会挂的情况是一棵树上接了很多路,然后互相更新的时候边数挂了。
然后考虑一下建一些点来降低边的数目,对于树最好的选择就是建虚树。
这题卡常,我最大的点跑了2.984秒,时限3s,而且Subtask,没挂真是太好了,233333333。
T3:大根
给定N个区间和K个颜色,每个颜色的贡献是它染的区间的交的大小,求最大贡献。
先发现染色的范围一定是一段一段的(除了某种特殊情况)。
考虑一下一个区间包含另一个区间的情况,
一种是大区间小区间一个染色,
然后大区间不可能有贡献,可删。
另一种是大区间小区间不是一个颜色,这种情况大区间一定单独一个颜色。
然后可以单调队列优化成O(NK) DP。
有特殊情况是直接选前K-1大的区间,剩下的区间一个颜色,取MAX就行了。
还有一种O(n)的解法,大致就是统计在某位置分割的贡献,排序后取前K大即可。
0708