[bzoj2752]高速公路 题解(线段树)
2752: [HAOI2012]高速公路(road)
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 2102 Solved: 887
[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
这道题所有操作都是对边进行的,所以我们化点编号为边编号,询问时将$Q_r--$。
一眼看出这应该是假期望,真正所求为
$\frac{\sum \limits_{i=l}^r \sum \limits_{j=l}^r dis[i][j]}{C_{r-l+1}^{2}}$
不要忘了我们已经将化点为边了,所以其实是
$\frac{\sum \limits_{i=l}^r \sum \limits_{j=l}^r dis[i][j]}{C_{r-l+2}^{2}}$
分母很好算,即$\frac {(r-l+2)(r-l+1)}{2}$
分子是需要我们维护的,但这种形式令我们无从下手。所以尝试换一种思路表示它。
对于每一段路,向左向右分别考虑它被经过的次数:
$\sum \limits_{i=l}^r{a[i]*(r-i+1)(i-l+1)}$
我们令$sum_1=\sum \limits_{i=l}^{r}{a[i]}$
$sum_2=\sum \limits_{i=l}^{r}{a[i]*i}$
$sum_3=\sum \limits_{i=l}^{r}{a[i]*i^2}$
把$\sum$拆开,化简一下得到$(r-l+1-r*l)*sum_1+(r+l)*sum_2-sum_3$
然后这三个$sum$用线段树维护的话左右儿子合并直接相加就行了,
但是本题还需要区间修改
对于$sum_1$,直接按照普通线段树区间加数的方式修改,区间长度乘上值
对于$sum_2$,我们需要对区间加上$val*\sum i$,这个建树时处理一下区间和即可
对于$sum_3$,我们需要对区间加上$val*\sum i^2$,类似于上面直接建树时处理
(所谓建树时处理,就是建树$l,r$重合时存进去就行了)
出题人真是毒瘤……第一次用$define\ int\ ll$这么粗糙的方式……
对于性质类似的变量,以数组形式存储、for循环更新能大幅减少代码长度和调试难度。
另外,输出答案时需要求gcd约分一下。
完结撒花!
#include<cstdio>
#include<iostream>
#include<cstring>
#define ls(k) k<<1
#define rs(k) k<<1|1
const int N=;
typedef long long ll;
#define int ll
int n,m;
ll gcd(ll x,ll y){while(y^=x^=y^=x%=y);return x;}
ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x*f;
}
int lsd[N<<],rsd[N<<];
ll sum[N<<][],lz[N<<],ans[];
void update(int k)
{
for(int i=;i<=;i++)
sum[k][i]=sum[ls(k)][i]+sum[rs(k)][i];
return ;
}
void build(int k,int l,int r)
{
lsd[k]=l,rsd[k]=r;
if(l==r)
{
sum[k][]=l*l;
sum[k][]=l;
return ;
}
int mid=l+r>>;
build(ls(k),l,mid);
build(rs(k),mid+,r);
for(int i=;i<=;i++)
sum[k][i]=sum[ls(k)][i]+sum[rs(k)][i];
return ;
}
void pdown(int k,ll val)
{
sum[k][]+=1LL*(rsd[k]-lsd[k]+)*val;
sum[k][]+=val*sum[k][];
sum[k][]+=val*sum[k][];
lz[k]+=val;
return ;
}
void down(int k)
{
pdown(ls(k),lz[k]);
pdown(rs(k),lz[k]);
lz[k]=;
return ;
}
void change(int k,int L,int R,ll val)
{
if(lsd[k]>=L&&rsd[k]<=R)
{
pdown(k,val);
return ;
}
if(lz[k])down(k);
int mid=lsd[k]+rsd[k]>>;
if(mid>=L)change(ls(k),L,R,val);
if(mid<R)change(rs(k),L,R,val);
update(k);
return ;
}
void query(int k,int L,int R)
{
if(lsd[k]>=L&&rsd[k]<=R)
{
for(int i=;i<=;i++)
ans[i]+=sum[k][i];
return ;
}
if(lz[k])down(k);
int mid=lsd[k]+rsd[k]>>;
if(mid>=L)query(ls(k),L,R);
if(mid<R)query(rs(k),L,R);
return ;
}
signed main()
{
n=read();m=read();
build(,,n);char op[];
int ql,qr;
while(m--)
{
scanf("%s",op);
ql=read();qr=read()-;
if(op[]=='C')
{
int val=read();
change(,ql,qr,val);
}
else
{
for(int i=;i<=;i++)ans[i]=;
query(,ql,qr);
ll res=1LL*(qr-ql+-qr*ql)*ans[]+1LL*(qr+ql)*ans[]-ans[];
ll mot=1LL*(qr-ql+)*(qr-ql+)/,GCD=gcd(res,mot);
res/=GCD;mot/=GCD;
printf("%lld/%lld\n",res,mot);
}
}
return ;
}
[bzoj2752]高速公路 题解(线段树)的更多相关文章
- 【bzoj2752】[HAOI2012]高速公路(road) 线段树
题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- POJ2182题解——线段树
POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
- 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] ...
- 高速公路 [HAOI2012] [线段树]
Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...
- P2221 [HAOI2012]高速公路(线段树)
P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...
随机推荐
- POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...
- Database基础(一):构建MySQL服务器、 数据库基本管理 、MySQL 数据类型、表结构的调整
一.构建MySQL服务器 目标: 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...
- 高级运维(七):Subversion基本操作、使用Subversion协同工作、制作nginx的RPM包
一.Subversion基本操作 目标: 本案例要求先快速搭建好一台Subversion服务器,并测试该版本控制软件: 1> 创建版本库 2> 导入初始化数据 3> 检出 ...
- [Repost] 悬线法
<浅谈用极大化思想解决最大子矩形问题>作者:王知昆 首先,根据定理1:最大有效子矩形一定是一个极大子矩形.不过与前一种算法不同的是,我们不再要求每一次枚举的一定是极大子矩形而只要求所有的极 ...
- 探索Redis设计与实现8:连接底层与表面的数据结构robj
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- JS基础入门篇(三十六)—面向对象( 三 )
1.class class es6 中 为 关键字用来声明 一个 类 1.只能通过new调用 2.不存在变量提升 3.多个方法之间直接书写,不需要,隔开 4.类的方法是直接定义在类的原型上的 5.定义 ...
- What size do you use for varchar(MAX) in your parameter declaration?
What size do you use for varchar(MAX) in your parameter declaration? In this case you use -1. See al ...
- selenium多表单操作与多窗口,以及警告框处理
知识是需要经常温习的,不然是很容易遗忘的. 以前自己操作IFRAME,多窗口的时候,觉得很简单.半年没有操作自动化了,知识又还了回去. 写博客有一个好处,可以把自己记住的知识点记录下来,这样,以后自己 ...
- 61、Queueable接口
public with sharing class QueueableSample implements Queueable{ private List<String> Name{get; ...
- 利用HTML制作一个简单的界面(工具HBuilder)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...