UER#6 票数统计
性质导向,算法导向,复杂度导向。请选取合适的入手方式。
显然可以把后缀信息变成前缀信息,只要我们知道投通过的用户数 \(s\)。
所以不妨想到花 \(O(n)\) 的时间复杂度枚举 \(s\) 的大小,\(O(m)\) 扫一遍所有约束的算法框架。
当 \(x\neq y\) 的时候,两个约束中一定有一个显然无法被满足,此时我们可以将它看作一个前缀约束或是一个枚举 \(s\) 之后的等价的前缀约束。但当 \(x=y\) 时,我们就无法轻易地确定它到底是描述前缀还是描述后缀了。不过不难发现类似【某一个前缀全部通过】这样的约束是非常弱、信息量非常少的,进一步地,我们发现对于两个分别为 \(x_i=y_i=a\) 和 \(x_j=y_j=b\) 的约束 \(i,j\),设 \(a<b\),则只要满足约束 \(j\) 就一定会满足约束 \(i\)。所以我们可以把 \(x=y\) 的约束全部删掉,只留下约束最强的那条即可。
此时我们会剩下若干形如【前 \(x_i\) 位用户恰好有 \(y_i\) 投了通过】的约束,和一条 \(x=y\) 的约束。不妨对 \(x=y\) 的约束做简单容斥,用限制前缀的答案加上限制后缀的答案,再减去前后缀都限制的答案。此时我们就只剩下了前缀约束,方案数即为 \(C_{\Delta x}^{\Delta y}\) 之积,注意判一下无解。
时间复杂度 \(O(nm\log m)\),log 是对于约束排序的复杂度。
对约束进行分类限制。复杂度导向。