车票

题目描述

  • \(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)\).

  • 之所以写假的,是因为假的贪心也有很多分,不知道为啥。

posted @ 2025-02-14 07:27  LUHCUH  阅读(25)  评论(1)    收藏  举报