题目大意:

给定一个长度为n的链,一共m次操作

对于每次操作

\(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v

\(Q\ l\ r\)在第l个到第r个点里等概率随机取出两个不同的点a和b,那么从a行驶到b将期望花费多少费用呢

QwQ我们可以考虑将期望分为分子和分母两部分

首先考虑分母,分母就是在\(r-l+1\)个点中选两个点的方案数,也就是\({r-l+1}\choose 2\)

而分子就是总权值了

对于一个在\([l,r]\)的点\(i\)来说

它会被计算\((i-l+1)\times (r-i+1)\)次 (就跟分别在左右两个区间枚举端点是一样的)

那么我们求的东西也就变成了

\(\sum_{i=l}^{r} w[i]\times(i-l+1)\times(r-i+1)\)

我们考虑将它展开:

\(\sum_{i=l}^{r} w[i]\times((r+l)\times i-i\times i +(r-l+1-r\times l))\)

再进一步来一波,对于区间\([l,r]\)我们就是求的是:

\((r+l)\times \sum_{i=l}^{r}w[i]\times i + (r-l+1-r\times l)\times \sum_{i=l}^{r}w[i] + \sum_{i=l}^{r}w[i]*i^2\)

而对于更新,我们也不难找出一些规律了咯

所以对于一个区间,我们只需要维护一个\(w[i],w[i]*i,w[i]*i^2,i^2,i\)的sigma值就能处理更新和合并了!

void up(int root)
{
f[root].si=f[2*root].si+f[2*root+1].si;
f[root].sii=f[2*root].sii+f[2*root+1].sii;
f[root].scostii=f[2*root].scostii+f[2*root+1].scostii;
f[root].scosti=f[2*root].scosti+f[2*root+1].scosti;
f[root].scost=f[2*root].scost+f[2*root+1].scost;
} void pushdown(int root,int l,int r)
{
ll mid = (l+r) >> 1;
if (add[root])
{
add[2*root]+=add[root];
add[2*root+1]+=add[root];
f[2*root].scost+=add[root]*(mid-l+1);
f[2*root+1].scost+=add[root]*(r-mid);
f[2*root].scosti+=add[root]*f[2*root].si;
f[2*root+1].scosti+=add[root]*f[2*root+1].si;
f[2*root].scostii+=add[root]*f[2*root].sii;
f[2*root+1].scostii+=add[root]*f[2*root+1].sii;
add[root]=0;
}
}

emmmmm

query的时候也记得\(\times\)的时候要乘询问的总区间,而不是当然区间!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#define ll long long
using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} const int maxn = 1e5+1e2; struct Node{
ll scost,scosti,scostii,si,sii;
ll ans;
}; Node f[4*maxn];
ll add[4*maxn];
int n,m; ll count(int xx,int yy)
{
ll x=xx,y=yy;
return (y-x+1)*(y-x+2)/2;
} void up(int root)
{
f[root].si=f[2*root].si+f[2*root+1].si;
f[root].sii=f[2*root].sii+f[2*root+1].sii;
f[root].scostii=f[2*root].scostii+f[2*root+1].scostii;
f[root].scosti=f[2*root].scosti+f[2*root+1].scosti;
f[root].scost=f[2*root].scost+f[2*root+1].scost;
} void pushdown(int root,int l,int r)
{
ll mid = (l+r) >> 1;
if (add[root])
{
add[2*root]+=add[root];
add[2*root+1]+=add[root];
f[2*root].scost+=add[root]*(mid-l+1);
f[2*root+1].scost+=add[root]*(r-mid);
f[2*root].scosti+=add[root]*f[2*root].si;
f[2*root+1].scosti+=add[root]*f[2*root+1].si;
f[2*root].scostii+=add[root]*f[2*root].sii;
f[2*root+1].scostii+=add[root]*f[2*root+1].sii;
add[root]=0;
}
} void build(int root,int l,int r)
{
if (l==r)
{
f[root].si=(long long)1LL*l;
f[root].sii=(long long) 1LL*l*l;
return;
}
int mid = (l+r) >> 1;
build(2*root,l,mid);
build(2*root+1,mid+1,r);
up(root);
} void update(int root,int l,int r,int x,int y,ll p)
{
if (x<=l && r<=y)
{
ll len=r-l+1;
f[root].scost+=1LL*p*len;
f[root].scosti+=1LL*p*f[root].si;
f[root].scostii+=1LL*p*f[root].sii;
add[root]+=p;
return;
}
pushdown(root,l,r);
int mid = (l+r) >> 1;
if (x<=mid) update(2*root,l,mid,x,y,p);
if (y>mid) update(2*root+1,mid+1,r,x,y,p);
up(root);
} ll query(int root,int l,int r,int x,int y)
{
if (x<=l && r<=y)
{
ll xx = x,yy=y;
return (long long)1LL*(xx+yy)*f[root].scosti+(long long)1LL*(yy-xx+1-xx*yy)*f[root].scost-f[root].scostii;
}
pushdown(root,l,r);
int mid = (l+r) >> 1;
ll ans=0;
if (x<=mid) ans+=query(2*root,l,mid,x,y);
if (y>mid) ans+=query(2*root+1,mid+1,r,x,y);
return ans;
} int main()
{
scanf("%d%d",&n,&m);
n--;
build(1,1,n);
for (int i=1;i<=m;i++)
{
char s[10];
scanf("%s",s+1);
if (s[1]=='C')
{
int x,y;
ll z;
scanf("%d%d%lld",&x,&y,&z);
y--;
update(1,1,n,x,y,z);
}
if (s[1]=='Q')
{
int x,y;
scanf("%d%d",&x,&y);
y--;
ll tmp=query(1,1,n,x,y);
ll tmp1=count(x,y);
printf("%lld/%lld\n",tmp/__gcd(tmp1,tmp),tmp1/__gcd(tmp1,tmp));
}
}
return 0;
}

HAOI2012高速公路bzoj2752 (线段树,数学)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. [luoguP2221] [HAOI2012]高速公路(线段树)

    传送门 考虑每一段对答案的贡献 用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1] 如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[ ...

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

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

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

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

随机推荐

  1. rEFI引导Win10+Ubuntu14双系统

    公司买了一台Alienware 15 R2,安装双系统折腾死我了,现在记录一下安装过程. 硬盘: 256固态+1T机械 安装顺序: 先Windows,再Ubuntu 不同BIOS启动方式下安装系统 U ...

  2. Win7安装 Mysql 5.7.22客户端

    根据自己的操作系统下载对应的32位或64位的压缩包: http://dev.mysql.com/downloads/mysql/ 官网下载 选择Windows对应的版本下载 不注册直接下载 安装步骤 ...

  3. DNS重新绑定攻击

    来自微信外挂的安全风险 DNS重新绑定攻击 DDNS 动态域名设置

  4. 虚拟数字存储表——SQLServer2012可高用

    窗口函数之虚拟数字辅助表 数字辅助表是一个整数序列,可以用它来完成多种不同的查询任务.数字表有很多任务,如生成日期和时间值序列,及分裂值列表.通常,建议在数据库中保存这样一个永久表,并填充尽可能多的数 ...

  5. AWS扩容EC2实例根空间

    文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...

  6. Pytest 系列(24)- allure 环境准备

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html allure 和 pytest 相 ...

  7. Flask(2)- 第一个 Flask Application

    安装 flask Flask 是一个 Web 框架,使用它首先需要安装 pip3 install flask 导入 Flask 模块 import flask 最简单的一个栗子 主代码 from fl ...

  8. 基本ServletWEB项目

    项目搭建 项目链接https://gitee.com/zhangjzm/smbms.git 前置知识,Servlet JSP 结构图 搭建maven web项目 1.搭建一个maven web项目 2 ...

  9. Model 特性

    表 1 AssociatedMetadataTypeTypeDescriptionProvider 通过添加在关联类中定义的特性和属性信息,从而扩展某个类的元数据信息. AssociationAttr ...

  10. Linux的基础指令(二)

    目录:   一.列表显示目录内容-ls    二.设置别名-alias      三.统计目录及文件空间占用情况-du       四.创建新目录 -mkdir          五.创建空文件-to ...