BZOJ2752:[HAOI2012]高速公路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2752
https://www.luogu.org/problemnew/show/P2221#sub
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将期望花费多少费用呢?
洛谷给它定的标签是“概率期望”,实际上难在维护线段树。
首先我们把路费变成点费,那么n--,所有询问r--。
那么期望=(所有路段的钱的和)/(路段个数),路段个数很好求,专注维护前面的。
对于一个数v[i],它所提供的价值为:
(1+r-l-lr)*v[i]+(l+r)*i*v[i]-i*i*v[i]。
所以维护v[i],i*v[i],i*i*v[i]即可。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
inline char getc(){
char ch=getchar();
while(ch<'A'||ch>'Z')ch=getchar();
return ch;
}
inline ll sig(ll l,ll r){
return (l+r)*(r-l+)>>;
}
inline ll ssig(ll l,ll r){
ll a=(l-)*l*(*l-)/;
ll b=r*(r+)*(*r+)/;
return b-a;
}
ll tr[N][],lazy[N];
void push(int a,int l,int r,int mid){
if(!lazy[a])return;
tr[a<<][]+=(mid-l+)*lazy[a];
tr[a<<|][]+=(r-mid)*lazy[a];
tr[a<<][]+=sig(l,mid)*lazy[a];
tr[a<<|][]+=sig(mid+,r)*lazy[a];
tr[a<<][]+=ssig(l,mid)*lazy[a];
tr[a<<|][]+=ssig(mid+,r)*lazy[a];
lazy[a<<]+=lazy[a];
lazy[a<<|]+=lazy[a];
lazy[a]=;
}
void modify(int a,ll l,ll r,ll l1,ll r1,ll v){
if(r<l1||r1<l)return;
if(l1<=l&&r<=r1){
lazy[a]+=v;
tr[a][]+=(r-l+)*v;
tr[a][]+=sig(l,r)*v;
tr[a][]+=ssig(l,r)*v;
return;
}
ll mid=(l+r)>>;
push(a,l,r,mid);
modify(a<<,l,mid,l1,r1,v);modify(a<<|,mid+,r,l1,r1,v);
tr[a][]=tr[a<<][]+tr[a<<|][];
tr[a][]=tr[a<<][]+tr[a<<|][];
tr[a][]=tr[a<<][]+tr[a<<|][];
}
ll query(int a,ll l,ll r,ll l1,ll r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1){
return (+r1-l1-l1*r1)*tr[a][]+(l1+r1)*tr[a][]-tr[a][];
}
ll mid=(l+r)>>;
push(a,l,r,mid);
return query(a<<,l,mid,l1,r1)+query(a<<|,mid+,r,l1,r1);
}
ll gcd(ll a,ll b){
return (!b)?a:gcd(b,a%b);
}
int main(){
int n=read()-,m=read();
for(int i=;i<=m;i++){
char ch=getc();
int l=read(),r=read()-;
if(ch=='C')modify(,,n,l,r,read());
else{
ll a=query(,,n,l,r),b=sig(,r-l+);
ll g=gcd(a,b);
printf("%lld/%lld\n",a/g,b/g);
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ2752:[HAOI2012]高速公路——题解的更多相关文章
- BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ...
- 【线段树】BZOJ2752: [HAOI2012]高速公路(road)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 627[Submit] ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- [BZOJ2752][HAOI2012]高速公路
BZOJ Luogu sol 看上去是道数学期望题但实际上是个傻逼数据结构 首先答案的形式应该就是 \[\frac{\mbox{[l,r]区间内的子区间权值之和}}{\mbox{[l,r]区间内的子区 ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
- luogu P2221 [HAOI2012]高速公路题解
题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...
- [bzoj2752]高速公路 题解(线段树)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2102 Solved: 887[Submit] ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
随机推荐
- 一个只有十行的精简MVVM框架(上篇)
本文来自网易云社区. 前言 MVVM模式相信做前端的人都不陌生,去网上搜MVVM,会出现一大堆关于MVVM模式的博文,但是这些博文大多都只是用图片和文字来进行抽象的概念讲解,对于刚接触MVVM模式的新 ...
- MAC 更新brew 镜像源
mac 更新brew镜像源 cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" git remote set-url o ...
- FCL中你不得不知的几种委托
FCL中丰富的类库信息极大的方便了我们的编码,很多我们日常经常用到的类型,FCL中已经帮我们定义好,下面要介绍的就是FCL中定义好的几种委托类型,直接使用它们不仅能提高我们的编码效率,而且还能让我们的 ...
- 一次简单的C++编译错误
快要下班的时候,开发部的一名小鲜肉找我帮忙解决一个问题: 才哥,我们提供给计费组的库在计费主机上编译报错了,但是提供给其他组用时没有编译报错.计费也不认,说编译器报的是我们代码上的错误,要我解决,帮我 ...
- photoshop cc 2018安装破解教程(破解补丁,亲测,绝对可用)
破解步骤说明:下载地址百度网盘,https://pan.baidu.com/s/1cWtpUesl2fms3tFwEC0MiQ 1.右键解压Adobe Photoshop CC 2018 64位这个文 ...
- 初学Direct X(10)—— D3D基础预备知识
初学Direct X(10) -- D3D基础预备知识 1. 像素格式 D3DFMT_X8R8G8B8(F) X:未加使用 8:8位用于显示 B:用于显示蓝色 F:浮点像素类型 以下三个较为常用,使用 ...
- Grid 网格布局
CSS 网格布局(Grid Layout) 是CSS中最强大的布局系统. 这是一个二维系统,这意味着它可以同时处理列和行,不像 flexbox 那样主要是一维系统. 你可以通过将CSS规则应用于父元素 ...
- LeetCode 109——有序链表转化二叉搜索树
1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入 ...
- day-17 L1和L2正则化的tensorflow示例
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数.L2范数也被称为权重衰 ...
- python 智能合约日志操作
from __future__ import unicode_literals import json from time import sleep, time # 中文编码 def encode_s ...