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 是对于约束排序的复杂度。

对约束进行分类限制。复杂度导向。

posted @ 2023-10-13 17:27  ydtz  阅读(11)  评论(0编辑  收藏  举报