H. 3.魔法传输

H. 3.魔法传输

这道题是区间加上等差数列的修改,我们直接去修改会很难想

然后我们可以发现他这个只有单点查询,所以我们就可以这么想,类似于一个差分操作

我们在每一次操作的时候我们就直接将这个区间都加上一,然后再将右端点的后一位减去区间长度

对于每一次单点查询我们就直接对这个点进行前缀和操作即可。

#include <bits/stdc++.h> #define ls p << 1 #define rs p << 1 | 1 using namespace std; typedef long long ll; const int N = 4e5 + 10, mod = 1e9 + 7; ll sum[N], add[N], n, m; void pushup(int p) { sum[p] = (sum[ls] + sum[rs]) % mod; } void pushdown(int p, int len) { if (add[p]) { add[ls] += add[p]; add[rs] += add[p]; sum[ls] += add[p] * (len - (len >> 1)); sum[ls] %= mod; sum[rs] += add[p] * (len >> 1); sum[rs] %= mod; add[p] = 0; } } void update(int p, int l, int r, int ql, int qr, ll k) { if (ql <= l && r <= qr) { add[p] += k; sum[p] += k * (r - l + 1); sum[p] %= mod; return; } pushdown(p, r - l + 1); int mid = (l + r) >> 1; if (ql <= mid) update(ls, l, mid, ql, qr, k); if (qr > mid) update(rs, mid + 1, r, ql, qr, k); pushup(p); } ll query(int p, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) return sum[p]; pushdown(p, r - l + 1); ll res = 0; int mid = (l + r) >> 1; if (ql <= mid) res = (res + query(ls, l, mid, ql, qr)) % mod; if (qr > mid) res = (res + query(rs, mid + 1, r, ql, qr)) % mod; return res; } char op[2]; int main() { cin >> n >> m; while (m--) { int x, y; cin >> op; if (op[0] == 'Q') { cin >> x; cout << query(1, 1, n, 1, x) << endl; } else { cin >> x >> y; update(1, 1, n, x, y, 1); update(1, 1, n, y + 1, y + 1, -(y - x + 1)); } } return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/17652555.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示