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] ...
随机推荐
- python 3.6 setup
1.添加python3.6安装包,并且安装 sudo apt-get install software-properties-common 2.下载python3.6 sudo add-apt-rep ...
- Ruby 基础教程 1-1
1.指定编码方式 第一种 在代码文件首行通过 #encoding:GBK的方式 第二种 ruby -E UTF-8 文件名称 第三种 irb -E UTF-8 2 ...
- hdu1171Big Event in HDU(01背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Appium_Python_API说明
Appium_Python_API 1.contexts contexts(self): Returns the contexts within the current session. 返回当前会话 ...
- Linux命令应用大词典-第16章 归档和压缩
16.1 tar:进行归档和压缩 16.2 gzip:压缩或解压缩gzip文件 16.3 gunzip:解压缩gzip文件 16.4 zcmp:比较gzip压缩文件 16.5 zdiff:比较gzip ...
- 【template、import、include】微信小程序:模板(template)、引用(import、include)说明
模板(template): 定义模板 <template name="[String]"> <!-- 模板代码 --> <view> <t ...
- 【json提取器】- 提取数据的方法
json 提取器的使用 方法 json 提取器 提取的结果 我用调试取样器进行查看
- Dev c++ 调试步骤
不能调试的时候,修改下列地方: 1.在“工具”->编译选项->”Add following commands when calling complier”下面的编辑框里写入:-g3 2.在 ...
- solidity合约详解
Solidity 是一个面向合约的高级语言,其语法类似于JavaScript .是运行在以太坊虚拟机中的代码.这里我们用的是remix编译环境.是一个在线的编译环境.地址为http://remix.e ...
- [leetcode-783-Minimum Distance Between BST Nodes]
Given a Binary Search Tree (BST) with the root node root, return the minimum difference between the ...