BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1820 Solved: 736
[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
C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4
Sample Output
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
这题跟期望有个鸡毛关系??
每个位置被选择的概率是相等的,因此每次询问的答案为
$\frac{\sum_{i = l}^r \sum_{j = i}^r dis(i, j)}{C_{r - l + 1}^2}$,
发现下面是个常数
上面比较难处理,考虑枚举每一个数的贡献$\sum_{i = l}^r a[i] * (r - i + 1) * (i - l + 1)$
然后展开,发现可以用线段树维护。
完了。。
#include<cstdio>
#include<algorithm>
//#define LL long long
#define int long long
using namespace std;
const int MAXN = * 1e5 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
#define ls(k) k << 1
#define rs(k) k << 1 | 1
struct Node {
int l, r, siz;
int w[], tag;
Node() {
w[] = w[] = w[] = tag = l = r = ;
}
/*Node operator + (const Node &rhs) const {
Node x = *this;
for(int i = 0; i < 2; i++) x.w[i] += rhs.w[i];
return x;
}*/
void print() {
printf("%d %d %d\n", w[], w[], w[]);
}
}T[MAXN];
void update(int k) {
for(int i = ; i <= ; i++) T[k].w[i] = T[ls(k)].w[i] + T[rs(k)].w[i];
}
int calc(int n) {
return ( * n + ) * (n + ) * n / ;
}
void down(int val, int k) {
T[k].w[] += ((T[k].r + ) * T[k].r - (T[k].l ) * (T[k].l - )) / * val;
T[k].w[] += (calc(T[k].r) - calc(T[k].l - )) * val;
T[k].w[] += T[k].siz * val;
T[k].tag += val;
}
void pushdown(int k) {
if(!T[k].tag) return;
down(T[k].tag, ls(k)); down(T[k].tag, rs(k));
T[k].tag = ;
}
void Build(int k, int ll, int rr) {
T[k].l = ll; T[k].r = rr; T[k].siz = rr - ll + ;
if(ll == rr) return ;
int mid = ll + rr >> ;
Build(ls(k), ll, mid); Build(rs(k), mid + , rr);
}
void IntervalAdd(int k, int ll, int rr, int val) {
if(ll <= T[k].l && T[k].r <= rr) {
down(val, k); return ;
}
pushdown(k);
int mid = (T[k].l + T[k].r) >> ;
if(ll <= mid) IntervalAdd(ls(k), ll, rr, val);
if(rr > mid) IntervalAdd(rs(k), ll, rr, val);
update(k);
}
Node Merge(Node x, Node y) {
for(int i = ; i <= ; i++)
x.w[i] += y.w[i];
return x;
}
Node IntervalAsk(int k, int ll, int rr) {
Node ans;
//ans.print();
if(ll <= T[k].l && T[k].r <= rr) {
ans = T[k];
return ans;
}
pushdown(k);
int mid = T[k].l + T[k].r >> ;
//Node ls = IntervalAsk(ls(k), ll, rr);
if(ll <= mid) ans = Merge(ans, IntervalAsk(ls(k), ll, rr));
if(rr > mid) ans = Merge(ans, IntervalAsk(rs(k), ll ,rr));
//ans.print();
return ans;
}
int Query(int l, int r) {
Node ans = IntervalAsk(, l, r);
int up, down;
down = (r - l + ) * (r - l + ) / ;
up = ans.w[] * (r + l) - ans.w[] - ans.w[] * (r * l + l - r - );
int gcd = __gcd(down, up);
printf("%lld/%lld\n", up / gcd, down / gcd);
}
int N, Q;
main() {
N = read(); Q = read();
Build(, , N);
while(Q--) {
char c = '-'; while(c != 'C' && c != 'Q') c = getchar();
int l = read(), r = read(), v;
if(c == 'C') v = read(), IntervalAdd(, l, r - , v);
else Query(l, r - );
}
}
BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)的更多相关文章
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- 【bzoj2752】[HAOI2012]高速公路(road) 线段树
题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
- 【线段树】BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 627[Submit] ...
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- P2221 [HAOI2012]高速公路(线段树)
P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...
- [luoguP2221] [HAOI2012]高速公路(线段树)
传送门 考虑每一段对答案的贡献 用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1] 如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[ ...
随机推荐
- (转)mysql5.6.7多实例安装、配置的详细讲解分析及shell启动脚本的编写
一.mysql安装 1.下载mysql数据库源码包: wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.27.tar.gz 2.安装mys ...
- express --- session详解
之前一直做前端相关的工作,所以不太清楚session,也没有主动了解,最近在学node,对session的认识又有所加深,故总结之. 注: 关于session的一些配置问题,可以看这里. 第一部分: ...
- stm32 输入捕获学习(二)
(本文参考STM32 开发指南 V1.3 -- ALIENTEK 战舰 STM32 开发板库函数教程 ) 1. 实验设计 我们用 TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电 ...
- hduoj 2955Robberies
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- web页面实时刷新之browser sync
web开发对实时刷新的需求 在刚开始学习前端时每次修改文件内容后都需要手工刷新下浏览器来看效果,做的次数多了就特别难受,有时仅仅修改了一个字母都需要刷新下页面查看 之后接触到编写边看的集成IDE,文件 ...
- jq学习总结之方法
三.方法 1.length 2.index()3.get() reverse()4.not()5.filter()6.find()7.each()8.addBack()9.attr()10.toggl ...
- Spring文件下载
package com.smbea.demo.controller; import java.io.BufferedInputStream; import java.io.BufferedOutput ...
- 切片操作:MATLAB VS Python
切片操作:MATLAB VS Python 一.MATLAB 矩阵的拆分 1.冒号表达式: t = e1:e2:e3 e1表示初始值,e2为步长,e3为终止值(包括e3),产生一个从e1到e3,步长为 ...
- NoSQL(Not Only SQL)
Everything has its properties and has relation with each other. All in world can be related to each ...
- Java学习笔记——String类常用方法
所谓的字符串就是对数组的包装,所以字符串内容无法进行更改.String在JDK1.8以前保存的是字符数组:private final char value[]; 而在JDK1.9之后保存的是字节数组: ...