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. hdu 3572 Task Schedule (Dinic模板)

    Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...

  2. POJ 1426 Find The Multiple (dfs??!!)

    Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose ...

  3. Python深度学习

    序言 目的驱动型学习 概念解释 资料 https://www.tensorflow.org/ https://www.imooc.com/video/17186 https://www.cnblogs ...

  4. 自己动手写ORB特征

    通过一些简单的算法修改,使ORB的提取效率加速了5.8倍.编译该程序需要CPU支持SSE指令集. 如果我们能够对特征提取部分进一步并行化处理,则算法还可以有加速的空间. // // Created b ...

  5. kafka 简单安装以及java小demo

    文章目录 第1步,下载解压 kafka: 第2步,运行 kafka: 第3步,创建topic 第4步,生产者发送消息 第5步,消费者接收消息 使用 java 客户端 kafka 0.8.0版本demo ...

  6. UE格式化XML文件

    在UE中如何格式化xml:如果xml文件不是格式化的,应该“试图”-->“查看方式”-->“xml”:然后再“格式”-->“xml转换到回车符”.具体再要的属性,自己去摸索

  7. SCI小论文投稿记录

    英文小论文投的是SCI 3区的一个刊物,收录在spring,ei等, 投稿的时候2019/2/3影响因子2.8左右 现在2019/8/13  影响因子3.844 先科普下论文的各个状态 1. Subm ...

  8. 13.JMeter 参数化、检查点、集合点

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  9. 三、函数 (SUM、MIN、MAX、COUNT、AVG)

    第八章 使用数据处理函数 8.1 函数 SQL支持利用函数来处理数据.函数一般是在数据上执行的,给数据的转换和处理提供了方便. 每一个DBMS都有特定的函数.只有少数几个函数被所有主要的DBMS等同的 ...

  10. MySQL中的关系

    关系 将实体与实体的关系,反应到最终数据库表的设计中来.将关系分为三种:一对一,一对多(多对一)和多对多.所有的关系都是指的是表与表之间的关系. 一对一 一张表中的一条记录一定只能与另外一张表的一条记 ...