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 l<r,在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢?

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的非负整数

N,M<=1e5

Solution
对于一次询问,第i条边的贡献为 wi*(i-L+1)*(R-i+1)

可以这么理解,在i的左边(包括自身)选择起点,在i的右边(包括自身)选择终点,相乘即为组合的个数

然后

我们就可以看出,用线段树分别维护三个值:S0:∑wi , S1:∑(wi*i) , S2:∑(wi*i2)即可

(S2漏乘了一个val)

这个该死的线段树调了我两个小时。以后打线段树还是要小心一点慢点打 = =

Code

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;i++)
#define per(i,a,b) for(RG i=a;i>=b;i--)
#define inf (1<<30)
#define maxn 100005
#define ll long long
#define ls pos<<1
#define rs pos<<1|1
#define L t[pos].l
#define R t[pos].r
#define mid ((t[pos].l+t[pos].r)>>1)
#define cal0(x,y) x*y
#define cal1(x,y,z,w) (x+y)*z*w/2ll
#define cal2(x,y,z) (y*(y+1ll)*(2ll*y+1ll)-x*(x-1ll)*(2ll*x-1ll))*z/6ll //bug
using namespace std;
int n,m;
struct T{
int l,r;
ll s0,s1,s2,tag;
}t[maxn<<];
struct Dat{
ll a0,a1,a2;
inline Dat operator + (const Dat x)const{
return (Dat){a0+x.a0,a1+x.a1,a2+x.a2};
}
};
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void build(int pos,int l,int r)
{
t[pos].l=l,t[pos].r=r;
if(l==r) return;
build(ls,l,mid);build(rs,mid+,r);
} inline void pushdown(int pos)
{
t[ls].tag+=t[pos].tag,t[rs].tag+=t[pos].tag;
ll len1=t[ls].r-t[ls].l+,len2=t[rs].r-t[rs].l+;//bug t[ls].s0+=cal0(len1,t[pos].tag),
t[ls].s1+=cal1(t[ls].l,t[ls].r,len1,t[pos].tag),
t[ls].s2+=cal2(t[ls].l,t[ls].r,t[pos].tag); t[rs].s0+=cal0(len2,t[pos].tag),
t[rs].s1+=cal1(t[rs].l,t[rs].r,len2,t[pos].tag),
t[rs].s2+=cal2(t[rs].l,t[rs].r,t[pos].tag); t[pos].tag=;
} void update(int pos,int l,int r,ll val)
{
if(l<=L&&R<=r)
{
ll len=R-L+;
t[pos].s0+=cal0(len,val),
t[pos].s1+=cal1(L,R,len,val),
t[pos].s2+=cal2(L,R,val);
t[pos].tag+=val;
return;
}
if(t[pos].tag) pushdown(pos);
if(l<=mid) update(ls,l,r,val);//bug
if(r>mid) update(rs,l,r,val);//bug
t[pos].s0=t[ls].s0+t[rs].s0,
t[pos].s1=t[ls].s1+t[rs].s1,
t[pos].s2=t[ls].s2+t[rs].s2;
} Dat query(int pos,int l,int r)
{
if(l<=t[pos].l&&t[pos].r<=r)
return (Dat){t[pos].s0,t[pos].s1,t[pos].s2};
if(t[pos].tag) pushdown(pos);
Dat ans=(Dat){,,};
if(l<=mid) ans=query(ls,l,r);
if(r>mid) ans=ans+query(rs,l,r);
return ans;
} ll gcd(ll a,ll b){return (!(a%b)?b:gcd(b,a%b));} int main()
{
n=read(),m=read();
build(,,n-);
char opt[];
register ll l,r,v;
rep(i,,m)
{
scanf("%s",opt);
if(opt[]=='C')
{
l=read(),r=read()-,v=read();
update(,l,r,v);
}
else
{
l=read(),r=read()-;
Dat ans=query(,l,r);
ll up=ans.a0*(r-l-l*r+1ll)+ans.a1*(l+r)-ans.a2;
ll down=(r-l+1ll)*(r-l+2ll)/2ll;
ll gd=gcd(up,down);
up/=gd,down/=gd;
printf("%lld/%lld\n",up,down);
}
}
return ;
}

高速公路 [HAOI2012] [线段树]的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)

    传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...

  9. [bzoj2752]高速公路 题解(线段树)

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

随机推荐

  1. 微信小程序--WXS---JS 代码插入

    主页要使用的JS代码放在index.js里面 例 Page({ data: { array: [1, 2, 3, 4, 5, 1, 2, 3, 4] } }) 只复制以下这段 data: { arra ...

  2. 美国主机BlueHost vs HostEase

    网站备案对于大部分个人站长而言,花费成本高.程序复杂,因此在挑选主机时,常选择免备案IDC服务商,如美国.香港主机,且前几日国内某免备案机房因个别网站涉及非法言论而配合相关部门采取停网整顿等,为此站长 ...

  3. Ubuntu下Gradle环境配置

    sudo gedit ~/.profile sudo source ~/.profile env # for java export JAVA_HOME=/home/cmm/jdk export CL ...

  4. python---自己实现二分法列表查找

    这是以我自己的思维来实现的,没有用递归. # coding = utf-8 # 二分查找,适用于有序列表,日常编程用不到,因为index函数可以搞定的. # 查找到数字,返回列表中的下标,找不到数字, ...

  5. Spring MVC基础知识整理➣拦截器和自定义注解

    概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...

  6. (一)cygwin和vim——hello world!

    好吧,我现在初出茅庐,一无所有,只有一台win xp.做什么呢?要不要试试Unix命令行编程的感觉,想到就做.Just try! 1.首先安装cygwin,最好是选择离线安装包. 2.默认选择安装所有 ...

  7. Linux图形化监控网络流量:speedometer查看流量

    Speedometer是一个带宽控制台和对数带宽显示的文件下载进度监控,以及一个简单的命令行界面.其目的是测量和显示网络连接或数据存储在文件中的数据率. Speedometer 2.8该版本增加了一个 ...

  8. Could not locate executable null\bin\winutils.exe in the Hadoop binaries解决方式 spark运行wordcoult

    虽然可以正常运行,但是会出异常,现给出解决方法. 1.问题:   2.  问题解决: 仔细查看报错是缺少winutils.exe程序. Hadoop都是运行在Linux系统下的,在windows下ec ...

  9. spring ,springmvc,mybatis 最基本的整合,没有多余的jar包和依赖 2018.9.29日

    最基本的ssm框架整合 本案例采用2018商业版intellij  idea  编辑器    maven项目管理工具  tomcat8.5 接着上一篇使用springmvc最基本配置开始 https: ...

  10. Linux用过的命令集合

    1,查看是否安装过openssl:(openssl version -a)(rpm -qa|grep -i openssl) 2,安装gcc:(yum install gcc-c++) 3,查看主机名 ...