:::info[Description] Link. :::
:::infoSolution 前置知识:经典恒等式 。
对相邻元素之间的关系分块。一次询问 可以看作是询问 区间内的关系贡献。注意到 ,因此考虑固定 的值。记 ,则设相邻两个元素的值分别是 , 和 就可以分别写作是 和 。比较大小关系只需要比较 和 即可。设 ,则上面两个式子相等必须满足 。
具体分类讨论两式相等时 可能的取值范围:
- :。
- ,。
- ,。
因此考虑对每个 值,都建一个关于 合法取值范围的差分数组,然后分块,存储每个块内每个 值的信息,查询时整块查表散块直接暴力算即可。需要调一下块长。 :::
:::success[Code]
namespace lowspeed_song {
inline void init() {
}
int n, m, a[N], tmp[N], L[400], R[400], bel[N], off[505], diff[400][125755];
inline void add(int k, int b, int l, int r) { if (l < r) ++diff[k][off[b] + l], --diff[k][off[b] + r]; }
inline void build() {
for (int b = 1; b <= 500; ++b) off[b + 1] = off[b] + b + 1;
const int blk = 256;
for (int i = 1; i < n; ++i) bel[i] = (i - 1) / blk + 1;
for (int i = 1; i < n; ++i) R[bel[i]] = i;
for (int i = n - 1; i; --i) L[bel[i]] = i;
for (int b = 1; b <= 500; ++b) {
for (int i = 1; i <= n; ++i) tmp[i] = a[i] - a[i] / b * b;
for (int k = 1; k <= bel[n - 1]; ++k) {
for (int i = L[k]; i <= R[k]; ++i) {
if (a[i] / b == a[i + 1] / b) add(k, b, 0, b - max(tmp[i], tmp[i + 1])), add(k, b, b - min(tmp[i], tmp[i + 1]), b);
else if (a[i] / b == a[i + 1] / b + 1 && tmp[i + 1] > tmp[i]) add(k, b, b - tmp[i + 1], b - tmp[i]);
else if (a[i] / b + 1 == a[i + 1] / b && tmp[i] > tmp[i + 1]) add(k, b, b - tmp[i], b - tmp[i + 1]);
} int sum = 0;
for (int i = 0; i < b; ++i) sum += diff[k][off[b] + i], diff[k][off[b] + i] = sum;
}
}
}
inline int chk(int i, int A, int b) { return (a[i] + A) / b == (a[i + 1] + A) / b; }
inline int qry(int l, int r, int a, int b) {
int res = 0;
if (bel[l] == bel[r - 1]) {
for (int i = l; i < r; ++i) res += chk(i, a, b);
return res;
}
for (int i = l; i <= R[bel[l]]; ++i) res += chk(i, a, b);
for (int k = bel[l] + 1; k < bel[r - 1]; ++k) res += diff[k][off[b] + a % b];
for (int i = L[bel[r - 1]]; i < r; ++i) res += chk(i, a, b);
return res;
}
inline void sol() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i];
build();
int las = 0;
while (m--) {
int l, r, a, b; cin >> l >> r >> a >> b;
l ^= las, r ^= las, a ^= las, b ^= las;
cout << (las = qry(l, r, a, b)) << '\n';
}
}
} // namespace lowspeed_song:::
难度:紫
鲜活指数:6
喜欢的话,留下你的评论吧~