车票
题目描述
- \(n\) 个环形车站,\(n\) 种票,地 \(i\) 种票负责 \(i,i+1\) 之间的往返。
- 有 \(n\) 个从 \(u\) 到 \(v\) 的需求。每次买票需要买 \(n\) 种的每一张一个
- 问最少要买多少组?
题解
-
设票的贡献为区间 \([l,r]\) 我们可以操作,使 \([l,r]\) 变成 \([1,l-1],[r+1,n]\)
-
首先二分答案,考虑每个位置化到合法。
-
嗯,先随机发现一些性质,所有操作的区间必然有交,因为没有交取反之后,一定互相严格覆盖,不如都不取反,所以所有操作的区间有交。
-
尝试枚举交点,判断是否合法。
-
我不知道为啥我还没学会,设要枚举的交点为 \(x\),我们想要合法就要每个位置合法,不妨设每个位置的区间需要操作 \(b_i\) 次,最开始有 \(a_i\) 个区间,那么对于前半部分也就是要满足,\(a_i-\sum_{j\le i}b_j+\sum_{i<j\le x}b_j\le mid\),那看来我们不仅要知道 \(x\) 是多少,还要枚举 \(b_x\) 的值
-
着很难看,不妨设 \(b_i\) 的前缀和 \(s_i\),\(a_i-s_i+s_x-s_i\le mid\),由此 \(\frac{a_i+s_x-mid}{2}\le s_i\),这是枚举 \(b_i\) 的下界,我们只想勉强维持下届就好了,我们依次扫描,把所有的 \([i,?]\) 加入一个堆,我们每次贪心的取 \([\le i,?]\) \(?\) 最大的,显然左面符合答案,我们只需要判断右边是否符合答案即可。
-
\(O(n^3log^2)\) 的
-
额,我们尝试去掉枚举 \(b_x\) 的值,由于 \(\frac{a_i+s_x-mid}{2}\le s_i\le s_x\),\(a_i-mid\le s_x\) 求 \(a_i\) 的最大值,的那个 \(s_x\) 就是最优的 \(s_x\). \(O(n^2log^2n)\)
-
额,上面的结论假了。
-
我们可以证明 \(mid=c_i,c_i+1\),其中 \(c_i\) 是操作后的 \(a_i\) 会变为多少理由如下,设所有区间的交为 \([x,y]\) 那么我们通过撤销一次 \([x,?],[?,y]\) 来使得 \(c_i\) 增大,而使 \(c\) 最大减小或不变,最大的 \(c\) 减小或不变,所以答案不会更差,所以 \(c_x\) 是 \([x,y]\) 中 \(c\) 的最大值,或者最大值减 \(1\),\(a_i-s_x=mid\),\(a_i-s_x=mid-1\)
-
\(x\) 只枚举单调栈上的最大位置即可,若是枚举单调栈之后的位置,显然可贪的限制更紧,最大的 \(b_x\) 卡点还是前缀最大的 \(a_i\) 那不如在 \(a_i\) 处都计算了。
-
所以只需要 \(a_x-s_x=mid,mid-1\) 即可 \(O(n^2log^2n)\)
-
额,之后想枚举的 \(x\) 是否会是 \(a_x\) 最大的呢?如果存在更的却不是 \(x\),更大的 \(a\) 的减小次数必然小于等于 \(b_i\),这样都合法,那为什么不只保留覆盖 \(a\) 更大的区间呢?要是覆盖区间一样的话枚举那个显然都行,不一样的那,至少可以删一个不覆盖 \(a\) 大的区间。所以只算所有 \(a\) 最大位置的 \(x\) 就行了
-
故此只要找第一个 \(a\) 最大的 \(x\),就行了 \(O(nlog^2n)\).
-
之所以写假的,是因为假的贪心也有很多分,不知道为啥。

浙公网安备 33010602011771号