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

Source

开始时,并不知道怎么用线段树维护期望,向lyp咨询了下,然后他教会了我怎么做:
对于一段区间l,r,ans=∑ki*pi。ki指的是这个点的权值,pi指对答案贡献的概率。
现在我们想pi怎么计算。pi=(i-l+1)(r-i+1)/((r-l+1)(r-l+2)/2)。对于某个i,要选到他,必须从其前面的(i-l+1)中选一个(包括自身)和后面的(r-i+1)中选一个(也包括自身),而总共的方案为C(n+1,2)=((r-l+1)(r-l+2)/2)。
所以,ans=∑ki(i-l+1)(r-i+1)/((r-l+1)(r-l+2)/2),分母是一定的,所以可以提出,所以我们要求的即为ans=∑ki*(i-l+1)*(r-i+1)。
令L=l-1,R=r+1。ans=∑ki(i-L)(R-i)=∑ki(-i2+(R+L)i-RL)=∑-i2ki+(R+L)∑iki-RL∑ki。就连蒟蒻的我都看出怎么维护了。。。三个sum数组:ki,iki,i2ki
PS:注意看题。我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。所有输入的r都要减一。
 
 #include<cstdio>
#include<cstdlib>
using namespace std; typedef long long ll;
#define maxn 100010 ll n,m;
struct node
{
ll sign; ll s1,s2,s3;
inline node() { sign = s1 = s2 = s3 = ; }
friend inline node operator +(const node &x,const node &y)
{
node ret;
ret.s1 = x.s1+y.s1;
ret.s2 = x.s2+y.s2;
ret.s3 = x.s3+y.s3;
return ret;
}
}tree[maxn*]; inline ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; } inline void modify(ll l,ll r,ll now,ll key)
{
tree[now].sign += key;
tree[now].s1 += (r - l + )*key;
tree[now].s2 += ((ll)r*(ll)(r+)*(ll)(*r+)/(ll)-(ll)(l-)*(ll)l*(ll)(*l-)/(ll))*key;
tree[now].s3 += (ll)(l+r)*(ll)(r-l+)/(ll)*key;
} inline void pushdown(ll l,ll r,ll now)
{
if (!tree[now].sign) return;
if (l != r)
{
ll mid = (l + r) >> ;
modify(l,mid,now<<,tree[now].sign);
modify(mid+,r,(now<<)+,tree[now].sign);
}
tree[now].sign = ;
return;
} inline void updata(ll now)
{
ll t = tree[now].sign;
tree[now] = tree[now<<]+tree[(now<<)+];
tree[now].sign = t;
} inline void change(ll l,ll r,ll now,ll ql,ll qr,ll key)
{
pushdown(l,r,now);
if (l >= ql&&r <= qr)
{
modify(l,r,now,key);
return;
}
ll mid = (l + r) >> ;
if (qr <= mid) change(l,mid,now<<,ql,qr,key);
else if (ql > mid) change(mid+,r,(now<<)+,ql,qr,key);
else change(l,mid,now<<,ql,mid,key),change(mid+,r,(now<<)+,mid+,qr,key);
updata(now);
} inline node ask(ll l,ll r,ll now,ll ql,ll qr)
{
pushdown(l,r,now);
if (l >= ql&&r <= qr) return tree[now];
ll mid = (l + r) >> ;
if (qr <= mid) return ask(l,mid,now<<,ql,qr);
else if (ql > mid) return ask(mid+,r,(now<<)+,ql,qr);
else return ask(l,mid,now<<,ql,mid)+ask(mid+,r,(now<<)+,mid+,qr);
} int main()
{
freopen("2752.in","r",stdin);
freopen("2752.out","w",stdout);
scanf("%lld %lld\n",&n,&m);
while (m--)
{
char opt; scanf("%c",&opt);
if (opt == 'C')
{
ll l,r,v; scanf("%lld %lld %lld\n",&l,&r,&v);
--r;
change(,n,,l,r,v);
}
else
{
ll l,r; scanf("%lld %lld\n",&l,&r); r--;
node ret = ask(,n,,l,r);
ll L = l-,R = r+;
ll up = -(L*R)*ret.s1-ret.s2+(L+R)*ret.s3,down = (ll)(r-l+)*(ll)(r-l+)>>1LL,d = gcd(up,down);
up /= d; down /= d;
printf("%lld/%lld\n",up,down);
}
}
fclose(stdin); fclose(stdout);
return ;
}

BZOJ 2572 高速公路的更多相关文章

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

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

  2. [BZOJ 2752] 高速公路

    Link: BZOJ 2752 传送门 Solution: 虽然有期望,但实际上就是除了个总数…… 此题计算总代价明显还是要使用对每个$w_i$计算贡献的方式: $w_i的贡献为w_i*(i-l+1) ...

  3. BZOJ 2752 高速公路(road)(线段树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2752 题意:给出一个数列A,维护两种操作: (1)将区间[L,R]之内的所有数字增加de ...

  4. BZOJ 3091 城市旅行

    Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 Sample ...

  5. 【BZOJ】【2752】【HAOI2012】高速公路(Road)

    数学期望/线段树 然而又是一道road= =上一道是2750…… 下次不要一看期望题就弃疗么…… 期望题≠不可做题……!! 其实在这题中,期望就是(所有情况下 权值之和)/(总方案数) 因为是等概率抽 ...

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

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

  7. bzoj 2752: [HAOI2012]高速公路(road)

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

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

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

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

    [HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...

随机推荐

  1. thymeleaf 和其它标签组合 获取数据

    thymeleaf 有很多的内置标签, 但是我们在开发中会引入其它很多标签, 这个时候, 后台数据过来了,前端 页面要怎么显示呢? 网上资料真的很少. 不过还是找到了答案:  th:attr 这个标签 ...

  2. ArrayList and LinkedList

    ArrayList and LinkedList List代表一种线性表的数据结构,ArrayList则是一种顺序存储的线性表.ArrayList底层采用数组来保存每个集合元素,LinkedList则 ...

  3. 解决方法:未能加载文件或程序集“Microsoft.Office.Interop.Excel。。

    .NET错误提示:未能加载文件或程序集“Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToke ...

  4. android 49 广播接收者中启动其他组件

    main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...

  5. 自定义 textField 的清除 button

    UIButton *clearButton = [self.textField valueForKey:@"_clearButton"]; [clearButton setImag ...

  6. Android性能优化典范 - 第5季

    这是Android性能优化典范第5季的课程学习笔记,拖拖拉拉很久,记录分享给大家,请多多包涵担待指正!文章共10个段落,涉及的内容有:多线程并发的性能问题,介绍了AsyncTask,HandlerTh ...

  7. iOS图片压缩

    项目中常会遇到,上传图片的操作,由于iPhone手机直接拍照的图片往往比较大,一般3-4M,如果直接上传不做处理会浪费用户很多流量,再者有很多场景并不需要高清图片,所以在上传图片前对图片进行压缩,是很 ...

  8. HTML5 TypeArray和Unicode 字符之间转换

    1.Uint32Array测试成功 // Uint32Array 测试成功 //字符串转为ArrayBuffer对象 function strToab() { var str = '张三丰'; var ...

  9. java中json转xml

    参考:http://heipark.iteye.com/blog/1394844 需要json-lib-2.1-jdk15.jar和xom-1.2.5.jar,maven pom.xml如下: xml ...

  10. UTF-8和GBK有什么区别?

    字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. 至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码.对于英文字符 ...