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

【BZOJ2752】【Luogu P2221】 [HAOI2012]高速公路的更多相关文章

  1. 【题解】Luogu P2221 [HAOI2012]高速公路

    原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...

  2. luogu P2221 [HAOI2012]高速公路题解

    题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...

  3. P2221 [HAOI2012]高速公路(线段树)

    P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...

  4. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

  5. 洛谷 P2221 [HAOI2012]高速公路

    链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...

  6. 洛谷P2221 [HAOI2012]高速公路

    线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  7. P2221 [HAOI2012]高速公路

    思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...

  8. 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)

    传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...

  9. BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

  10. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 627[Submit] ...

随机推荐

  1. JavaScript数值千分位格式化的方法和性能

    瞎掰的前提 前端嘛,经常处理数值和时间. 所以数值和时间的格式化少不了. 最近一直在面试前端, 就出了一个如何给数值添加千分位的面试题. 至于答案,我一直都有一种标准, 一是基于你现有的知识可以实现, ...

  2. java程序加到系统托盘的方法

    package swingtest; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; impor ...

  3. Linux系统编程——基础命令总结

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/asialee_bird/article/ ...

  4. Appium,AirTest切换使用时,appium罢工之坑(1)

    由于一些元素不能定位,所以最近项目引用了Airtest 问题场景: case的开始使用appium,case执行过程中,切换到airtest操作元素,待执行完airtest相关步骤之后,后续使用app ...

  5. ubuntu 16.04 关闭开启图形界面

    说明案例:ubuntu16.04 关闭图形界面命令: systemctl disable lightdm.service 开启图形界面命令: ln -s /lib/systemd/system/lig ...

  6. webdriervAPI(下载文件)

    from  selenium  import  webdriver driver  =  webdriver.Chorme() driver.get("http://www.baidu.co ...

  7. Java小知识----POI事件模式读取Excel 2007

    一.知识背景 1.读取excel的方法选择问题 java中读excel中的时间,我们通常用POI去解析,在使用new HSSFWorkbook(NEW FileInputStream(excelFil ...

  8. [转帖]$PWD 和 $(pwd)

    $PWD 和 $(pwd) https://blog.csdn.net/shaojwa/article/details/51894980 细节决定成败.   注意两个效果一样,但是注意大小写,PWD是 ...

  9. 转-性能优化中CPU、内存、磁盘IO、网络性能的依赖

    转自:https://www.cnblogs.com/Javame/p/3665565.html 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估. ...

  10. 虚拟机上安装Linux系统之ubuntu

    以前自己在虚拟机上安装过几回Linux系统,有centos.ubuntu,不过都没来得及写一个安装教程,今天正好需要重新安装一下,就分享一个安装ubuntu的详细教程 安装前准备: VMWare虚拟机 ...