题目地址
https://www.luogu.org/problemnew/show/2221
题目:
题目描述
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将期望花费多少费用呢?
输入输出格式
输入格式:
第一行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
输出格式:
对于每次询问操作回答一行,输出一个既约分数
若答案为整数a,输出a/1
输入输出样例
输入样例#1: 复制
4 5
C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4
说明
所有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
这题我周六下午看了整整两节语文课,还好最后想出来了,然后发现就是线段树+一些数学技巧
这道题目可以抽象为:给定一个数列$$a_n$$,给定数列的一个子数列$$[L,R]$$,求从$$[L,R]$$中等概率的任取两点$$a,b(b>a)$$,$$sum(a,b)$$的期望.
此外 注意题目有个坑 C l r v是将[l,r]之间的道路的收费加上v
以及要注意 Q l r 查询的是两座收费站之间的值 等价于查询[l,r-1]之间道路的值
例如对于数列1 2 2 2(就是样例)
查询子数列[1,3] 就需要计算($$a_1+(a_1+a_2)+(a_1+a_2+a_3)+(a_2)+(a_2+a_3)+(a_3))/C_{3-1+1}^{2}$$
观察分子上的值 如果我们将它分成三行
$$a_1+(a_1+a_2)+(a_1+a_2+a_3)$$
$$(a_2)+(a_2+a_3)$$
$$a_3$$
我们会发现 a1只在第一行出现 出现行数为1 每行出现了3次
a2在第一行与第二行出现 出现行数为2 每行出现了2次
a3在三行都出现 出现行数为3 每行出现了1次
然后我们会发现 区间[l,r]中的每一项在分子上出现的行数+每行出现的次数恰好等于l+r
emm 至于证明 我也不会
然后我们就有
分子:$$\sum i {(i-l+1)*(r-i+1)*cost[i]}$$
分母:$$C_{r-l+1}^{2}=(r-l+1)*(r-l)/2$$
然后我们将分子进一步拆开可得
$$\sum {(i-l+1)*(r-i+1)*cost[i]}= (-l*r-l+r+1)*\sum cost[i]+(l+r)*\sum {i*cost[i]}-\sum i {i*i*cost[i]}$$
这样的话 我们就可以用三棵线段树 分别维护 cost[i] cost[i]*i cost[i]*i*i了
另外有几个可能会用到的数列求和公式
$$a_n=n^2$$的前缀和:$$\frac {n(n+1)(2n+1)} 6$$
// luogu-judger-enable-o2
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* File: main.cpp
* Author: Ytong
*
* Created on 2017年11月10日, 下午2:54
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include