int hsh[2100000]; int ljl[2100000]; voidsolve() { // 1-based int n, m; cin >> n >> m; int *a = hsh + 1000000; int *b=ljl+1000000; for (int i = 1; i <= n; i++) { int v, x; cin >> v >> x; a[x - 3 * v + 1] += 1; a[x - 2 * v+1] -= 2; a[x + 1] += 2; a[x + 2 * v+1] -= 2; a[x + 3 * v + 1] += 1; } for (int i =-40000 ; i <= 40000+m; i++) { a[i] += a[i - 1]; b[i]+=b[i-1]+ a[i]; } for (int i = 1; i <= m; i++) { cout <<b[i]<<' '; } }
小 A 的好好师兄牛哥在去上班前给小 A 拟定了一份 m 项的奋斗清单。清单每行包含两个数字,分别代表奋斗事项类型和从第几天开始。已知对于第 x 天开始的奋斗事项有:
奋斗事项 1:从 x 天开始多奋斗 1 小时,第 x+1 天多奋斗 2 小时,第 x+2 天多奋斗 3 小时… ,从 x 天往后的第 k 天多奋斗 k+1 个小时,持续到第 n 天。
奋斗事项 2:从 x 天开始多奋斗 1 小时,第 x+1 天多奋斗 4 小时,第 x+2 天多奋斗 9 小时… ,从 x 天往后的第 k 天多奋斗 (k+1)2 个小时,持续到第 n 天。
帮他算出每天需要奋斗多少个小时。请输出答案对 109+7 取模后的结果。
数据范围
保证所有测试用例的 n 之和与 m 之和均不大于 105
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
for (int i = 1; i <= n; i++) { b1[i] = (b1[i - 1] + a1[i])%MOD; b2[i] = (b2[i - 1] + a2[i])%MOD; c1[i]=(c1[i-1]+b1[i])%MOD; c2[i]=(c2[i-1]+b2[i])%MOD; d[i]=(d[i-1]+c2[i])%MOD; ans[i]=((d[i]+d[i-1])%MOD+c1[i])%MOD; } for (int i = 1; i <= n; i++) { cout<<ans[i]<<' '; }
重叠线段覆盖处理
用途:计算多段重叠后的总覆盖长度。 常见坑:排序后处理重叠,注意边界。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
voidsolve(){ int n; cin >> n; vector<int> l(n), r(n); for (int i = 0; i < n; i++) cin >> l[i] >> r[i]; sort(l.begin(), l.end()); sort(r.begin(), r.end()); int ans = 0; for (int i = 0; i < n; i++) { ans += r[i] - l[i]; if (i + 1 < n && r[i] >= l[i + 1]) ans -= (r[i] - l[i + 1]); } cout << ans << '\n'; }