不是很难的一个题目。正确思路是统计每一条边被经过的次数,但我最初由于习惯直接先上了一个前缀和再推的式子,导致极其麻烦难以写对而且会爆\(longlong\)。

推导过程请看这里。

#include <bits/stdc++.h>
using namespace std; const int N = 100000 + 5; #define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
#define int long long int n, m, sum1, sum2, sum3; struct Segment_Tree {
int tag[N << 2], s1[N << 2], s2[N << 2], s3[N << 2]; Segment_Tree () {
memset (s1, 0, sizeof (s1));
memset (s2, 0, sizeof (s2));
memset (s3, 0, sizeof (s3));
memset (tag, 0, sizeof (tag));
} void push_up (int p) {
s1[p] = s1[ls] + s1[rs];
s2[p] = s2[ls] + s2[rs];
s3[p] = s3[ls] + s3[rs];
} int F1 (int x, int y) {return y - x + 1;} // \sum_{i = x} ^ {y} i ^ 0
int F2 (int x, int y) {return (x + y) * (y - x + 1) / 2;} // \sum_{i = x} ^ {y} i ^ 1
int F3 (int x, int y) {
x = x - 1;
int w1 = x * (x + 1) * (2 * x + 1) / 6;
int w2 = y * (y + 1) * (2 * y + 1) / 6;
return w2 - w1;
} // \sum_{i = x} ^ {y} i ^ 2 void work (int p, int l, int r, int val) {
s1[p] += F1 (l, r) * val;
s2[p] += F2 (l, r) * val;
s3[p] += F3 (l, r) * val;
tag[p] += val;
} void push_down (int p, int l, int r) {
work (ls, l, mid + 0, tag[p]);
work (rs, mid + 1, r, tag[p]);
tag[p] = 0;
} void modify (int nl, int nr, int w, int l = 1, int r = n, int p = 1) {
if (nl <= l && r <= nr) {
work (p, l, r, w);
return;
}
push_down (p, l, r);
if (nl <= mid) modify (nl, nr, w, l, mid, ls);
if (mid < nr) modify (nl, nr, w, mid + 1, r, rs);
push_up (p); return;
} void query (int nl, int nr, int l = 1, int r = n, int p = 1) {
if (nl <= l && r <= nr) {
sum1 += s1[p];
sum2 += s2[p];
sum3 += s3[p];
return;
}
push_down (p, l, r);
if (nl <= mid) query (nl, nr, l, mid, ls);
if (mid < nr) query (nl, nr, mid + 1, r, rs);
push_up (p); return;
}
}tr; // 维护 \sum_{x = L}^{R} sumd(x) int gcd (int x, int y) {
return y ? gcd (y, x % y) : x;
} signed main () {
freopen ("data.in", "r", stdin);
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
char opt; int l, r, v;
cin >> opt;
if (opt == 'C') {
cin >> l >> r >> v; r--;
tr.modify (l, r, v);
} else {
cin >> l >> r; r--;
sum1 = sum2 = sum3 = 0;
tr.query (l, r);
int w1 = (r - l + 1 - r * l);
int w2 = l + r;
int w3 = -1;
int upp = w1 * sum1 + w2 * sum2 + w3 * sum3;
int dwn = (r - l + 2) * (r - l + 1) / 2;
int d = gcd (upp, dwn); upp /= d, dwn /= d;
cout << upp << "/" << dwn << endl;
}
}
}

最新文章

  1. JAVA构造时成员初始化的陷阱
  2. Android开发自学笔记(Android Studio)&mdash;4.4 AdapterView及其子类
  3. [LeetCode] 452 Minimum Number of Arrows to Burst Balloons
  4. 今天说一下where 中 exists 和 in 里面的一些区别
  5. iOS开发网络篇—监测网络状态(转)
  6. Linux中安装和使用rz、sz命令
  7. 【原】简述使用spark集群模式运行程序
  8. C中调用LUA回调(LUA注册表)
  9. 陈发树云南白药股权败诉真相 取胜仅差三步 z
  10. UVA442 Matrix Chain Multiplication 矩阵运算量计算(栈的简单应用)
  11. [BZOJ 1500] [NOI2005] 维修数列
  12. Templates 模板:
  13. BZOJ1639: [Usaco2007 Mar]Monthly Expense 月度开支
  14. WordPress插件开发记录
  15. 合理的使用size_t可以提高程序的可移植性和代码的可读性,让你的程序更高效。
  16. 多线程之:MESI-CPU缓存一致性协议
  17. Python_编写UDP通信编解码类、文件的上传、远程执行命令、黏包
  18. android -------- MVP+DataBinding 的使用
  19. html 之 padding,margin
  20. 大数据新手之路二:安装Flume

热门文章

  1. 利用delve(dlv)在Visual Code中进行go程序的远程调试-debug方式
  2. 微信小程序wxml页面toFixed保留两位小数,wxs脚本语言
  3. springboot mybatis 下使用注解组织查询语句(有查询条件传入)
  4. 在vue中后台返回的文本包含标签时候解析为html代码
  5. MATLAB2014b parpool 报错,并行工具无法开启解决方法
  6. POJ3734 Block母函数入门
  7. 测试工具/PostMan
  8. jmeter—获取当前时间(年、月、日),往前/往后n天
  9. Python input/output boilerplate for competitive programming
  10. Intel Driver and Support Assistant 安装失败