对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到

然后化简一下得到

这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了

--------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 100009;
 
int N, Q, L, R, v;
ll sump[maxn];
 
struct Node {
Node *l, *r;
int Ad;
ll v, pv, ppv;
Node() : Ad(0) {
}
void update(int _l, int _r) {
if(_l == _r) {
v += Ad;
Ad = 0;
pv = v * _l;
ppv = v * (sump[_r] - sump[_l - 1]);
} else {
v = l->v + r->v;
pv = l->pv + r->pv;
ppv = l->ppv + r->ppv;
if(Ad) {
v += ll(Ad) * (_r - _l + 1);
pv += ll(Ad) * (_l + _r) * (_r - _l + 1) >> 1;
ppv += ll(Ad) * (sump[_r] - sump[_l - 1]);
}
}
}
void pushDown() {
if(Ad != 0) {
l->Ad += Ad;
r->Ad += Ad;
Ad = 0;
}
}
} pool[maxn << 1], *Root, *pt = pool;
 
void Build(Node* t, int l, int r) {
int m = (l + r) >> 1;
if(l == r) return;
Build(t->l = pt++, l, m);
Build(t->r = pt++, m + 1, r);
}
 
void Modify(Node* t, int l, int r) {
if(L <= l && r <= R) {
t->Ad += v;
} else {
t->pushDown();
int m = (l + r) >> 1;
L <= m ? Modify(t->l, l, m) : t->l->update(l, m);
m < R ? Modify(t->r, m + 1, r) : t->r->update(m + 1, r);
}
t->update(l, r);
}
 
ll Query(Node* t, int l, int r) {
if(L <= l && r <= R)
return t->pv * (L + R) - t->ppv - t->v * R * (L - 1);
int m = (l + r) >> 1;
ll ret = 0;
t->pushDown();
t->l->update(l, m); t->r->update(m + 1, r);
if(L <= m) ret += Query(t->l, l, m);
if(m < R) ret += Query(t->r, m + 1, r);
return ret;
}
 
ll gcd(ll x, ll y) {
return y ? gcd(y, x % y) : x;
}
 
int main() {
scanf("%d%d", &N, &Q);
sump[0] = 0;
for(int i = 1; i <= N; i++)
sump[i] = ll(i) * (i + 1) + sump[i - 1];
Build(Root = pt++, 1, N);
while(Q--) {
char c;
scanf(" %c%d%d", &c, &L, &R);
if(c == 'Q') {
ll tot = Query(Root, 1, N), n = (ll) (R - L) * (R - L + 1) / 2;
ll d = gcd(tot, n);
printf("%lld/%lld\n", tot / d, n / d);
} else {
scanf("%d", &v);
R--;
Modify(Root, 1, N);
}
}
return 0;
}

--------------------------------------------------------------------

2752: [HAOI2012]高速公路(road)

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 968  Solved: 339
[Submit][Status][Discuss]

Description

Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。
Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。高速路刚建成时所有的路段都是免费的。
政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。
无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的l,r(l<r),在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢?

Input

第一行2个正整数N,M,表示有N个收费站,M次调整或询问
接下来M行,每行将出现以下两种形式中的一种
C l r v 表示将第l个收费站到第r个收费站之间的所有道路的通行费全部增加v
Q l r   表示对于给定的l,r,要求回答小A的问题
所有C与Q操作中保证1<=l<r<=N

Output

对于每次询问操作回答一行,输出一个既约分数
若答案为整数a,输出a/1

Sample Input

4 5
C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4

Sample Output

1/1
8/3
17/6

HINT

数据规模

所有C操作中的v的绝对值不超过10000

在任何时刻任意道路的费用均为不超过10000的非负整数

所有测试点的详细情况如下表所示

Test N M

1 =10 =10

2 =100 =100

3 =1000 =1000

4 =10000 =10000

5 =50000 =50000

6 =60000 =60000

7 =70000 =70000

8 =80000 =80000

9 =90000 =90000

10 =100000 =100000

Source

BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )的更多相关文章

  1. BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

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

  2. BZOJ 2752 [HAOI2012]高速公路(road):线段树【维护区间内子串和】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2752 题意: 有一个初始全为0的,长度为n的序列a. 有两种操作: (1)C l r v: ...

  3. bzoj 2752: [HAOI2012]高速公路(road)

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...

  4. ●BZOJ 2752 [HAOI2012]高速公路(road)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2752题解: 期望,线段树. 把每个路段看成一个点,那么对于l~R的操作,就可以转化为对l~r ...

  5. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  6. 【bzoj2752】[HAOI2012]高速公路(road) 线段树

    题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...

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

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

  8. 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)

    传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...

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

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

随机推荐

  1. 《windows程序设计》学习_4:文本输出,加滚动条

    //总行数 #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) struct { int Index ; TCHA ...

  2. poj1547---结构数组

    题意:老师发给每个学生的橡皮泥相同,找出谁抢了谁的橡皮泥 思路:结构数组存储每个学生的橡皮总量,和名字 /* 结构数组存储用户信息--只放名称和体积 while输入循环复用长宽高变量 for循环求所有 ...

  3. linux内核源码阅读之facebook硬盘加速flashcache之五

    正常流程到flashcache_map的1623行或1625行,按顺序先看读流程: 1221static void 1222flashcache_read(struct cache_c *dmc, s ...

  4. 怎样通过css的media属性,适配不同分辨率的终端设备?

    怎样通过css的media属性,适配不同分辨率的终端设备,示比例如以下: <!DOCTYPE html> <html> <head> <title>首页 ...

  5. struts2中从数据库中读取数据,并在JSP页面中遍历保存有JavaBean对象的List对象

    0x1:前言 前面搭建struts就不说了,大家都能成功完毕. 0x2:Model 这里我们须要一个Model类来接收 <span style="font-size:10px;font ...

  6. 发现一个名为“Douyu”的国人项目

    刚刚在javaeye看到一个名为Douyu的国人项目,认为搞下去未来可能非常有意思,放到blog上做个标记. ——————下面是转载的作者原文——————— 原文地址例如以下:http://zhh20 ...

  7. onhashchange事件--司徒正美

    onhashchange事件是针对AJAX无缝刷新导致后退键失效而产生的事件,因此属于一个够新的事件,浏览器兼容性如下: Feature Chrome Firefox IE Opera Safari ...

  8. log4j.xml配置示例

    这是log4j1.x版本讲解,log4j-1.2.16.jar    1. 一般的log4j.xml的两种配置方式: 1.Logger 完成日志信息的处理定义输出的层次和决定信息是否输出DEBUG&l ...

  9. JavaSE复习日记 : 递归函数

    /* * 递归函数 * 什么是递归? * 在一个方法的内部,对自身进行调用,又叫做递归调用 * * 递归和循环的编写都包括三部分: * 1. 初始值; * 2. 终止条件; * 3. 前进步长; * ...

  10. (C++编程规范第17条)避免使用”魔数“

    1.摘要: 程序设计并非魔数,所以不要故弄玄虚:要避免在代码中使用诸如42和3.14159这样的文字常量.它们本身没有提供任何说明,并且因为增加了难于检测的重复而使维护更加复杂.可以用符号名称和表达式 ...