BZOJ

Luogu

sol

看上去是道数学期望题但实际上是个傻逼数据结构

首先答案的形式应该就是

\[\frac{\mbox{[l,r]区间内的子区间权值之和}}{\mbox{[l,r]区间内的子区间个数}}
\]

个数的话就是\((r-l+1)*(r-l)/2\)

总和的话,考虑每一段公路的贡献:

\[ans=\sum_{i=l}^{r-1}(i-l+1)*(r-i)*V_i\\=\sum_{i=l}^{r-1}[-i^2+(l+r-1)*i-lr+r]*V_i\\=\sum_{i=l}^{r-1}-V_ii^2+V_ii(l+r-1)-V_i(lr-r)
\]

所以线段树维护一下\(\sum V_i\)、\(\sum V_ii\)、\(\sum V_ii^2\)即可。为了压一点常数可以预处理出\(\sum i\)和\(\sum i^2\)。你硬是不想预处理也没有人拦你

code

谁来治一治我这压行。。。(硬是压进了70行呢)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
const int N = 100005;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
ll s[N<<2],si[N<<2],sii[N<<2],len[N<<2],i1[N<<2],i2[N<<2],tag[N<<2],ans1,ans2,ans3,p,q,gg;
int n,m;
void build(int x,int l,int r)
{
if (l==r) {len[x]=1,i1[x]=l,i2[x]=1ll*l*l;return;}
int mid=l+r>>1;
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
len[x]=len[x<<1]+len[x<<1|1],i1[x]=i1[x<<1]+i1[x<<1|1],i2[x]=i2[x<<1]+i2[x<<1|1];
}
void pushup(int x){s[x]=s[x<<1]+s[x<<1|1],si[x]=si[x<<1]+si[x<<1|1],sii[x]=sii[x<<1]+sii[x<<1|1];}
void cover(int x,int v){s[x]+=len[x]*v,si[x]+=i1[x]*v,sii[x]+=i2[x]*v,tag[x]+=v;}
void pushdown(int x){cover(x<<1,tag[x]);cover(x<<1|1,tag[x]);tag[x]=0;}
void modify(int x,int l,int r,int ql,int qr,int v)
{
if (l>=ql&&r<=qr) {cover(x,v);return;}
pushdown(x);int mid=l+r>>1;
if (ql<=mid) modify(x<<1,l,mid,ql,qr,v);
if (qr>mid) modify(x<<1|1,mid+1,r,ql,qr,v);
pushup(x);
}
void query(int x,int l,int r,int ql,int qr)
{
if (l>=ql&&r<=qr) {ans1+=s[x],ans2+=si[x],ans3+=sii[x];return;}
pushdown(x);int mid=l+r>>1;
if (ql<=mid) query(x<<1,l,mid,ql,qr);
if (qr>mid) query(x<<1|1,mid+1,r,ql,qr);
}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main()
{
n=gi();m=gi();
build(1,1,n-1);
while (m--)
{
char ch=getchar();
while (ch!='C'&&ch!='Q') ch=getchar();
if (ch=='C')
{
int l=gi(),r=gi(),v=gi();
modify(1,1,n-1,l,r-1,v);
}
else
{
int l=gi(),r=gi();
ans1=ans2=ans3=0;
query(1,1,n-1,l,r-1);
p=ans1*(r-1ll*l*r)+ans2*(l+r-1)-ans3;
q=1ll*(r-l+1)*(r-l)/2;
gg=gcd(p,q);p/=gg;q/=gg;
printf("%lld/%lld\n",p,q);
}
}
return 0;
}

[BZOJ2752][HAOI2012]高速公路的更多相关文章

  1. BZOJ2752: [HAOI2012]高速公路(road)

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

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

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

随机推荐

  1. 关于 IO的同步异步间要描述

    IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 比如你打开 ...

  2. shell脚本实现anisble客户端脚本分发和密钥授权配置

    ##############################Deploy ansible client shell######################## echo "start d ...

  3. mac攻略(1) -- 简单配置php开发环境

    [http://www.cnblogs.com/redirect/p/6112154.html]   最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP.   1.启动 Apache ...

  4. Centos 7系统优化脚本

    脚本如下,后续继续优化 #!/bin/bash #author junxi by #this script is only for CentOS 7.x #check the OS platform= ...

  5. SQL查询练习一(From LeetCode)

     请选用MySQL进行测试. 1.找出后一天比前一天温度高的日期(E) 思路:将该表进行自关联,然后选择出日期靠后的一天,最后选择温度高的日期 select Weather.Id from Weath ...

  6. Mybatis使用总结-思维导图

    目前使用到Mybatis的总结,缓存还未涉及:

  7. Java经典编程题50道之十七

    猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,而且又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,就只 ...

  8. Elasticsearch教程-从入门到精通(转载)

    转载,原文地址:http://mageedu.blog.51cto.com/4265610/1714522?utm_source=tuicool&utm_medium=referral 各位运 ...

  9. PHP秒杀系统全方位设计(一)

    秒杀系统特点人多商品少时间短流量高外挂机器[黄牛和非黄牛] 技术分析瞬间高并发的处理能力多层次的分布式处理能力人机交互与对抗[12306验证码图片] 技术选型分析Linux+Nginx+PHP+Mys ...

  10. C#中await和async关键字的简单理解

    C# 5.0之后,为了简化异步编程,引入了异步函数的概念,也就是方法标记async,然后可以使用await表达式来等待异步操作返回. await关键字看起来是一个阻塞线程的调用,但是实际上执行到awa ...