[CS Academy] Infinity Array

题意

  • 有一个长度为n的正整数序列\(a_{0\cdots n-1}\),有一个无限序列\(b_i\),其中\(b_i=a_{i\text{mod}n}\)
  • 有m组限制,每组限制形如\(\sum_{i=l}^rb_i\geq w\)\(\sum_{i=l}^rb_i\leq w\)
  • \(\sum a_i\)有多少种取值,如果有无限种则输出\(-1\),保证\(\sum a_i\leq10^9\)
  • \(n,m\leq1000\)

分析

很显然,这个题目里面的区间和的形式可以转化成两个前缀和的差分的一个限制,我们只要考虑到这个区间和的约束,总可以通过某种方式在两边减去一些\(S=\sum a_i\)来变成只在一段中的一个前缀和差分,也就是映射到只对应于原来的\(0\cdots n-1\)范围内前缀和的一个形式。
正整数的限制就是类似于\(f_i\leq f_{i+1}-1\)
我们考虑,最终这个\(S\)的取值一定是类似于一个区间,只要是超过了这个区间,对应差分约束系统里面就一定会出现负环。现在的问题就在于,我们如何来区分这个区间的\(l\)\(r\),从而能够非常容易地统计出答案?
考虑我们对于\(S\)来做二分然后做差分约束,系统无解的时候,找到对应的负环里面的\(S\)的系数\(c\)。如果\(c<0\),说明\(S\)太大了,如果\(c>0\)说明\(S\)太小了,如果\(c=0\)的时候,那无论怎样都会存在这个负环,答案一定为\(0\)

posted @ 2018-04-19 22:43  WenDavid  阅读(147)  评论(0编辑  收藏  举报