YACS 2023年1月月赛 乙组 T4 加与乘(二) 题解
应大家的要求,早上起来更一下乙组 T4。
这一道题目我们发现不仅会加元素了,还会重复执行任务。
很容易想到用两个树状数组来维护每个任务的执行次数,以及每个单元格中的数字。
逆向扫一下,轮到这个操作的时候先把这个操作执行次数算一下,
然后把这个操作的贡献做执行次数次就行了。
用指针写的话可以方便一点。
代码:
#include <iostream> #define int long long using namespace std; int n, m; int t1[200005], t2[200005]; int query (int t[], int x) { if (x == 0) return 0; return (t[x] + query (t, x - (x & -x) ) ) % 1000000007; } void add (int t[], int x, int y) { if (x > max(n, m) ) return; t[x] = (t[x] + y) % 1000000007; add (t, x + (x & -x), y); } struct Upd { char op; int l, r; }a[200005]; signed main () { ios::sync_with_stdio (false); cin >> n >> m; for (int i = 1; i <= m; i ++) cin >> a[i].op >> a[i].l >> a[i].r; for (int i = m; i >= 1; i --) { int time = query (t2, i) + 1; if (a[i].op == '+') { add (t1, a[i].l, time); add (t1, a[i].r + 1, - time); } if (a[i].op == '*') { add (t2, a[i].l, time); add (t2, a[i].r + 1, -time); } } for (int i = 1; i <= n; i ++) cout << (query (t1, i) + 1000000007) % 1000000007 << "\n"; return 0; }
分类:
YACS乙组月赛题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异