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

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

这道题所有操作都是对边进行的,所以我们化点编号为边编号,询问时将$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]高速公路 题解(线段树)的更多相关文章

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

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

  2. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  3. POJ2182题解——线段树

    POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...

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

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

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

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

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

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

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

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

  8. 高速公路 [HAOI2012] [线段树]

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

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

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

随机推荐

  1. POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  2. Database基础(一):构建MySQL服务器、 数据库基本管理 、MySQL 数据类型、表结构的调整

    一.构建MySQL服务器 目标: 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...

  3. 高级运维(七):Subversion基本操作、使用Subversion协同工作、制作nginx的RPM包

    一.Subversion基本操作 目标: 本案例要求先快速搭建好一台Subversion服务器,并测试该版本控制软件: 1> 创建版本库    2> 导入初始化数据    3> 检出 ...

  4. [Repost] 悬线法

    <浅谈用极大化思想解决最大子矩形问题>作者:王知昆 首先,根据定理1:最大有效子矩形一定是一个极大子矩形.不过与前一种算法不同的是,我们不再要求每一次枚举的一定是极大子矩形而只要求所有的极 ...

  5. 探索Redis设计与实现8:连接底层与表面的数据结构robj

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. JS基础入门篇(三十六)—面向对象( 三 )

    1.class class es6 中 为 关键字用来声明 一个 类 1.只能通过new调用 2.不存在变量提升 3.多个方法之间直接书写,不需要,隔开 4.类的方法是直接定义在类的原型上的 5.定义 ...

  7. 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 ...

  8. selenium多表单操作与多窗口,以及警告框处理

    知识是需要经常温习的,不然是很容易遗忘的. 以前自己操作IFRAME,多窗口的时候,觉得很简单.半年没有操作自动化了,知识又还了回去. 写博客有一个好处,可以把自己记住的知识点记录下来,这样,以后自己 ...

  9. 61、Queueable接口

    public with sharing class QueueableSample implements Queueable{ private List<String> Name{get; ...

  10. 利用HTML制作一个简单的界面(工具HBuilder)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...