https://www.luogu.org/problem/show?pid=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
输出样例#1:

1/1
8/3
17/6

说明

所有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 期望值= Σ 可能情况*出现概率
因为所有概率相等,所以本题可以转化为求 子集和/子集个数
根据组合数,子集个数=C(r-l+1,2)= (r-l+1)*(r-l)/2
子集和呢
推公式
子集和=Σ (i-l+1)*(r-i+1)*cost[i]
其中,
(i-l+1)*(r-i+1) 是每个数用到的次数
拆开,= (l+r)* Σ i*cost[i] + (r-l+1-l*r) * Σ cost[i] - Σ i*i*cost[i] 
线段树维护 Σcost[i] ,Σ i*cost[i],Σ i*i*cost[i]
更新,以+w为例:
Σcost[i] 加了size 个w,所以 Σcost[i] +=size*w
Σ i*cost[i] 加了 szie 个Σ i,所以 Σ i*cost[i] += size*Σ i
Σ i*i*cost[i] 加了 size个 Σ i*i,所以Σ i*i*cost[i] += size *Σ i*i
所以线段树需要另外维护 Σi,Σi*i
#include<cstdio>
#define N 100001
using namespace std;
int n,m,opl,opr,w;
long long ans1,ans2,ans3;
long long fz,fm,g;
struct node
{
long long i,a,ia,ii,iia,f;
int mid;
}e[N<<];
long long gcd(long long c,long long d) { return !d ? c : gcd(d,c%d); }
void build(int k,int l,int r)
{
if(l==r)
{
e[k].i=l; e[k].ii=1ll*l*l;
return;
}
e[k].mid=l+r>>;
build(k<<,l,e[k].mid);
build(k<<|,e[k].mid+,r);
e[k].i=e[k<<].i+e[k<<|].i;
e[k].ii=e[k<<].ii+e[k<<|].ii;
}
void down(int k,int l,int r)
{
int fl=e[k].f; e[k].f=;
e[k<<].f+=fl;
e[k<<].a+=1ll*fl*(e[k].mid-l+);
e[k<<].ia+=1ll*fl*e[k<<].i;
e[k<<].iia+=1ll*fl*e[k<<].ii;
e[k<<|].f+=fl;
e[k<<|].a+=1ll*fl*(r-e[k].mid);
e[k<<|].ia+=1ll*fl*e[k<<|].i;
e[k<<|].iia+=1ll*fl*e[k<<|].ii;
}
void change(int k,int l,int r)
{
if(l>=opl &&r<=opr)
{
e[k].a+=1ll*w*(r-l+);
e[k].ia+=1ll*w*e[k].i;
e[k].iia+=1ll*w*e[k].ii;
e[k].f+=w;
return;
}
if(e[k].f) down(k,l,r);
if(opl<=e[k].mid) change(k<<,l,e[k].mid);
if(opr>e[k].mid) change(k<<|,e[k].mid+,r);
e[k].a=e[k<<].a+e[k<<|].a;
e[k].ia=e[k<<].ia+e[k<<|].ia;
e[k].iia=e[k<<].iia+e[k<<|].iia;
}
void query(int k,int l,int r)
{
if(l>=opl && r<=opr)
{
ans1+=e[k].ia;
ans2+=e[k].a;
ans3+=e[k].iia;
return;
}
if(e[k].f) down(k,l,r);
if(opl<=e[k].mid) query(k<<,l,e[k].mid);
if(opr>e[k].mid) query(k<<|,e[k].mid+,r);
}
void read(int &x)
{
x=; int f=; char c=getchar();
while(c<'' || c>'') { if(c=='-') f=-; c=getchar(); }
while(c>='' && c<='') { x=x*+c-''; c=getchar(); }
x*=f;
}
int main()
{
read(n); read(m);
build(,,n-);
char s[];
while(m--)
{
scanf("%s",s);
if(s[]=='C')
{
read(opl); read(opr); read(w);
opr--;
change(,,n-);
}
else
{
read(opl); read(opr);
opr--;
ans1=ans2=ans3=;
query(,,n-);
fz=(opl+opr)*ans1+(1ll*opr-opl+-1ll*opl*opr)*ans2-ans3;
fm=1ll*(opr-opl+)*(opr-opl+)/;
g=gcd(fz,fm);
fz/=g; fm/=g;
printf("%lld/%lld\n",fz,fm);
}
}
}
 
 



HAOI 2012 高速公路的更多相关文章

  1. 大暴力——[HAOI]2012音量调节

    题目:[HAOI]2012音量调节 描述: 问题描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里 ...

  2. 【HAOI 2012】高速公路

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

  3. BZOJ 2750 HAOI 2012 Road 高速公路 最短路

    题意: 给出一个有向图,求每条边有多少次作为最短路上的边(任意的起始点). 范围:n <= 1500, m <= 5005 分析: 一个比较容易想到的思路:以每个点作为起点,做一次SPFA ...

  4. [HAOI 2012]音量调节

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  5. 解题:HAOI 2012 道路

    题面 这题不开O2怎么过=.= 可能这种有关最短路的计数题做多了就有些感觉了...... 以每个点为基准跑出一张最短路图,然后对每个边$(u,v)$统计两个东西.一个$pre[u]$表示到达$u$这个 ...

  6. BZOJ 2749 HAOI 2012 外星人 数论 欧拉函数

    题意: 给出一个数,给出的形式是其分解质因数后,对应的质因数pi及其次数qi,问对这个数不停求phi,直至这个数变成1,需要多少次.(多组数据) 范围:pi <= 1e5,qi <= 1e ...

  7. [HAOI 2012] Road

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2750 [算法] 考虑计算每个点对每条边的贡献 对于每个点首先运行SPFA或Dijks ...

  8. [HAOI 2012] 容易题

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2751 [算法] 考虑k = 0的情况 , 根据乘法原理 : Ans = (n * ( ...

  9. [HAOI 2012] 外星人

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2749 [算法] 首先 , 每次对一个数x进行操作 , 只会使该数减少一个2的因子 那 ...

随机推荐

  1. 蒟蒻关于斜率优化DP简单的总结

    斜率优化DP 题外话 考试的时候被这个玩意弄得瑟瑟发抖 大概是yybGG的Day4 小蒟蒻表示根本不会做..... 然后自己默默地搞了一下斜率优化 这里算是开始吗?? 其实我讲的会非常非常非常简单,, ...

  2. 多米诺骨牌放置问题(状压DP)

    例题: 最近小A遇到了一个很有趣的问题: 现在有一个\(n\times m\)规格的桌面,我们希望用\(1 \times 2\)规格的多米诺骨牌将其覆盖. 例如,对于一个\(10 \times 11\ ...

  3. [BZOJ3293] [Cqoi2011] 分金币 (贪心)

    Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...

  4. java volatile关键字解析

    volatile是什么 volatile在java语言中是一个关键字,用于修饰变量.被volatile修饰的变量后,表示这个变量在不同线程中是共享,编译器与运行时都会注意到这个变量是共享的,因此不会对 ...

  5. Servlet和Filter生命周期

    1. 生命周期 1.1. Servlet生命周期 servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要.s ...

  6. 谷歌chrome 插件(扩展)开发——进阶篇(c#本地程序和插件交互)下

    在上一篇中,我提出了总任务.接下来去实现. 获取网页内容等其它信息,这是content.js 擅长做的事情: chrome.extension.onMessage.addListener( funct ...

  7. 洛谷 P2401 不等数列

    其实有两种方法来解这道题# 第一种:找规律(非正经) 一看,这玩意像是个杨辉三角,还左右对称呢 因为新插入一个数$n$,有$n+1$个位置可以选,所以总数就乘$n+1$,对应的$f[n+1][i]$也 ...

  8. JavaScript中的execCommand

    execCommand方法是执行一个对当前文档,当前选择或者给出范围的命令.处理Html数据时常用 如下格式:document.execCommand(sCommand[,交互方式, 动态参数]) , ...

  9. elfinder中通过DirectoryStream.Filter实现筛选隐藏目录(二)

    今天还是没事看了看elfinder源码,发现之前说的两个版本实现都是基于不同的jdkelfinder源码浏览-Volume文件系统操作类(1), 带前端页面的是基于1.6中File实现,另一个是基于1 ...

  10. 用disabled属性修饰a标签,a标签仍然能点击

    1.不知道各位同学有没有遇到跟我相同的问题,就是用jQuery操作a标签disabled的,来控制重复提交表单 做过开发的都知道,表单验证重复提交,包含前端和后端,两方面的控制.前端控制使我们常用的手 ...