zoukankan      html  css  js  c++  java
  • bzoj 2752: [HAOI2012]高速公路(road)

    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

    算期望的话考虑用总权值/总方案。。。

    然后如何统计总权值,我们单独考虑每一条边会经过多少次来计算贡献,然后求和。。。

    即要求:

    然后暴力展开是要求:

    那么用线段树维护i^2*v[i],i*v[i],v[i]的和即可。。。

    这个题用cout输出会RE。。。

    // MADE BY QT666
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #define int  long long
    using namespace std;
    typedef long long ll;
    const int N=600050;
    int ls[N*4],rs[N*4],rt,sz,n,m;
    char ch[N];
    struct data{
      ll sum1,sum2,sum3;
    }tr[N*4];
    data operator + (const data &a,const data &b){
      return (data){a.sum1+b.sum1,a.sum2+b.sum2,a.sum3+b.sum3};
    }
    ll sum1[N],sum2[N],sum3[N],lazy[N*4];
    void pushup(int x){tr[x]=tr[ls[x]]+tr[rs[x]];}
    void insert(int &x,int l,int r,int id){
      if(!x) x=++sz;
      if(l==r) {tr[x].sum1=tr[x].sum2=tr[x].sum3=0;return;}
      int mid=(l+r)>>1;
      if(id<=mid) insert(ls[x],l,mid,id);
      else insert(rs[x],mid+1,r,id);
      pushup(x);
    }
    void Modify(int x,int v,int l,int r){
      tr[x].sum1+=1ll*v*(sum1[r]-sum1[l-1]);
      tr[x].sum2+=1ll*v*(sum2[r]-sum2[l-1]);
      tr[x].sum3+=1ll*v*(sum3[r]-sum3[l-1]);
    }
    void update(int x,int l,int r,int xl,int xr,int v){
      if(xl<=l&&r<=xr){Modify(x,v,l,r);lazy[x]+=v;return;}
      int mid=(l+r)>>1;
      if(xr<=mid) update(ls[x],l,mid,xl,xr,v);
      else if(xl>mid) update(rs[x],mid+1,r,xl,xr,v);
      else update(ls[x],l,mid,xl,mid,v),update(rs[x],mid+1,r,mid+1,xr,v);
      pushup(x);Modify(x,lazy[x],l,r);
    }
    data query(int x,int l,int r,int xl,int xr,int la){
      if(xl<=l&&r<=xr){
        return (data){
          tr[x].sum1+la*(sum1[r]-sum1[l-1]),
          tr[x].sum2+la*(sum2[r]-sum2[l-1]),
          tr[x].sum3+la*(sum3[r]-sum3[l-1])
        };
      }
      int mid=(l+r)>>1;la+=lazy[x];
      if(xr<=mid) return query(ls[x],l,mid,xl,xr,la);
      else if(xl>mid) return query(rs[x],mid+1,r,xl,xr,la);
      return query(ls[x],l,mid,xl,xr,la)+query(rs[x],mid+1,r,mid+1,xr,la);
    }
    ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
    main(){
      scanf("%lld%lld",&n,&m);
      for(int i=1;i<=n;i++) sum1[i]=sum1[i-1]+1,sum2[i]=sum2[i-1]+i,sum3[i]=sum3[i-1]+i*i; 
      for(int i=1;i<=n-1;i++) insert(rt,1,n-1,i);
      for(int i=1;i<=m;i++){
        scanf("%s",ch+1);
        if(ch[1]=='Q'){
          int l,r;scanf("%lld%lld",&l,&r);
          r--;data ans=query(rt,1,n-1,l,r,0);
          ll fm=-ans.sum3+1ll*(l+r)*ans.sum2-1ll*(l-r-1+l*r)*ans.sum1;
          ll fz=1ll*(r-l+2)*(r-l+1)/2;
          ll Gcd=gcd(fm,fz);
          printf("%lld/%lld
    ",fm/Gcd,fz/Gcd);
        }
        else{
          int l,r,v;scanf("%lld%lld%lld",&l,&r,&v);
          r--;update(rt,1,n-1,l,r,v);
        }
      }
      return 0;
    }
  • 相关阅读:
    Java泛型
    Java多态
    Anaconda+pycharm配置pytorch1.1.0+cuda 9.0+python3.7环境
    anaconda+fbprophet安装
    pycharm显示所有的tabs
    联想拯救者15-isk安装固态硬盘与系统迁移教程
    VS2017 C++操作mysql数据库
    mfc动态演示排序算法
    模拟处理机作业调度---短作业优先调度算法
    P3327 [SDOI2015]约数个数和
  • 原文地址:https://www.cnblogs.com/qt666/p/7414062.html
Copyright © 2011-2022 走看看