题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2752

题意:给出一个数列A,维护两种操作:

(1)将区间[L,R]之内的所有数字增加det;

(2)给出区间[L,R],在该区间内任意选出两个位置l和r(L<=l<=r<=R),[l,r]的费用为该区间的数字之和。求费用的期望。

思路:对于区间[L,R],长度len=(R-L+1),可知不同的区间种类有(len+1)*len/2种,那么接下来就是计算所有区间下的数字和的和S。我们发现:

接下来我们看对于这个S我们在修改时怎么维护它?对于区间[L,R],我们设置参数sum,Lsum,Rsum,t,p,size:

那么对于区间[L,mid],[mid+1,R]以及区间[L,R],我们设其分别为p、q、a,那么区间合并为:

对于区间增加x:

struct node
{
    int L,R;
    i64 sum,Lsum,Rsum,S,det,t,p,size;
    
    
    void add(i64 x)
    {
        det+=x;
        sum+=x*size;
        Lsum+=t*x;
        Rsum+=t*x;
        S+=x*p;
    }
};

node a[N<<2];

i64 get(i64 n)
{
    return n*(n+1)*(n+1)/2-n*(n+1)*(2*n+1)/6;
}

i64 get1(i64 n)
{
    return n*(n+1)/2;
}

void build(int t,int L,int R)
{
    a[t].L=L;
    a[t].R=R;
    a[t].size=R-L+1;
    a[t].t=get1(R-L+1);
    a[t].p=get(R-L+1);
    a[t].sum=a[t].Lsum=a[t].Rsum=a[t].S=0;
    a[t].det=0;
    if(L==R) return;
    int mid=(L+R)>>1;
    build(t*2,L,mid);
    build(t*2+1,mid+1,R);
}

void pushUp(node &a,node p,node q)
{
    if(a.L==a.R) return;
    a.sum=p.sum+q.sum;
    a.Lsum=p.Lsum+q.Lsum+q.sum*p.size;
    a.Rsum=q.Rsum+p.Rsum+p.sum*q.size;
    a.S=p.S+p.Lsum*q.size+q.S+q.Rsum*p.size;
}

void pushDown(int t)
{
    if(a[t].L==a[t].R) return;
    if(a[t].det)
    {
        a[t*2].add(a[t].det);
        a[t*2+1].add(a[t].det);
        a[t].det=0;
    }
}

void update(int t,int L,int R,i64 x)
{
    if(a[t].L==L&&a[t].R==R)
    {
        a[t].add(x);
        return;
    }
    pushDown(t);
    int mid=(a[t].L+a[t].R)>>1;
    if(R<=mid) update(t*2,L,R,x);
    else if(L>mid) update(t*2+1,L,R,x);
    else 
    {
        update(t*2,L,mid,x);
        update(t*2+1,mid+1,R,x);
    }
    pushUp(a[t],a[t*2],a[t*2+1]);
}

node getSum(int t,int L,int R)
{
    if(a[t].L==L&&a[t].R==R) return a[t];
    pushDown(t);
    node l,r,ans;
    int mid=(a[t].L+a[t].R)>>1;
    if(R<=mid) ans=getSum(t*2,L,R);
    else if(L>mid) ans=getSum(t*2+1,L,R);
    else 
    {
        l=getSum(t*2,L,mid);
        r=getSum(t*2+1,mid+1,R);
        ans.L=L;
        ans.R=R;
        ans.size=R-L+1;
        pushUp(ans,l,r);
    }
    pushUp(a[t],a[t*2],a[t*2+1]);
    return ans;
}

int n,m;

i64 Gcd(i64 x,i64 y)
{
    if(y==0) return x;
    return Gcd(y,x%y);
}

int main()
{
    RD(n,m);
    build(1,1,n-1);
    int L,R;
    i64 x,ans,S,k;
    char op[5];
    while(m--)
    {
        RD(op);
        if(op[0]=='C') 
        {
            RD(L,R); R--;
            RD(x);
            update(1,L,R,x);
        }
        else 
        {
            RD(L,R); R--;
            ans=getSum(1,L,R).S;
            S=get1(R-L+1);
            k=Gcd(ans,S);
            ans/=k; S/=k;
            printf("%lld/%lld\n",ans,S);
        }
    }
}

BZOJ 2752 高速公路(road)(线段树)的更多相关文章

  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. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

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

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

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

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

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

  7. [BZOJ 2752] 高速公路

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

  8. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  9. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

随机推荐

  1. 【BZOJ】【TJOI2015】线性代数

    网络流/最小割/最大权闭合图 2333好开心,除了一开始把$500^2$算成25000……导致数组没开够RE了一发,可以算是一次AC~ 咳咳还是回归正题来说题解吧: 一拿到这道题,我就想:这是什么鬼玩 ...

  2. JS 数组的基础知识

    数组 一.定义 1.数组的文字定义 广义上说,数组是相同类型数据的集合.但是对于强类型语言和弱类型语言来说其特点是不一样的.强类型语言数组和集合有以下特点. 数组强类型语言:1.数组里面只能存放相同数 ...

  3. SQL Server 2008中新增的 1.变更数据捕获(CDC) 和 2.更改跟踪

    概述 1.变更数据捕获(CDC)        每一次的数据操作都会记录下来 2.更改跟踪       只会记录最新一条记录   以上两种的区别:         http://blog.csdn.n ...

  4. Guid和Int还有Double、Date的ToString方法的常见格式

    Guid的常见格式: 1.Guid.NewGuid().ToString("N") 结果为:       38bddf48f43c48588e0d78761eaa1ce6 2.Gu ...

  5. 对drupal的理解【转】

    写本文是想跟刚用drupal的朋友,分享一下心得,国内用drupal的太少了,希望大家能好好交流. 希望几分钟看完后你能马上上手drupal,至少能理解hook,api,theme,module,cc ...

  6. Sqli-labs less 64

    Less-64 此处的sql语句为 $sql="SELECT * FROM security.users WHERE id=(($id)) LIMIT 0,1"; 示例payloa ...

  7. 通过登入IP记录Linux所有用户登录所操作的日志

    通过登入IP记录Linux所有用户登录所操作的日志 对于Linux用户操作记录一般通过命令history来查看历史记录,但是如果在由于误操作而删除了重要的数据的情况下,history命令就不会有什么作 ...

  8. Javascript里的那些距离们

    1.有滚动条的控件的距离: scrollTop和scrollLeft:分别指有滚动条的容器控件的滚动条的top和left:页面滚动条的通用取法:document.body.scrollTop(FF\C ...

  9. HDU 4006 The kth great number(multiset(或者)优先队列)

    题目 询问第K大的数 //这是我最初的想法,用multiset,AC了——好吧,也许是数据弱也有可能 //multiset运用——不去重,边插入边排序 //iterator的运用,插入的时候,如果是相 ...

  10. MYSQL 遭遇 THE TOTAL NUMBER OF LOCKS EXCEEDS THE LOCK TABLE SIZE

    今天进行MySql 一个表数据的清理,经过漫长等待后出现 The total number of locks exceeds the lock table size 提示.以为是table_cache ...