P2221 [HAOI2012]高速公路
思路
考虑每一条边的贡献,然后推式子
\]
然后用线段树维护就好了
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MAXN = 100100;
namespace Seg1{//v_i
    int seg[MAXN<<2]={},tag[MAXN<<2]={};
    void pushup(int o){
        seg[o]=seg[o<<1]+seg[o<<1|1];
    }
    void build(int l,int r,int o,int *a){
        if(l==r){
            seg[o]=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,o<<1,a);
        build(mid+1,r,o<<1|1,a);
        pushup(o);
    }
    void pushdown(int o,int ln,int rn){
        if(tag[o]){
            seg[o<<1]+=tag[o]*ln;
            seg[o<<1|1]+=tag[o]*rn;
            tag[o<<1]+=tag[o];
            tag[o<<1|1]+=tag[o];
            tag[o]=0;
        }
    }
    void add(int L,int R,int l,int r,int o,int c){
        if(L<=l&&r<=R){
            seg[o]+=c*(r-l+1);
            tag[o]+=c;
            return;
        }
        int mid=(l+r)>>1;
        pushdown(o,mid-l+1,r-mid);
        if(L<=mid)
            add(L,R,l,mid,o<<1,c);
        if(R>mid)
            add(L,R,mid+1,r,o<<1|1,c);
        pushup(o);
    }
    int query(int L,int R,int l,int r,int o){
        if(L<=l&&r<=R){
            return seg[o];
        }
        int mid=(l+r)>>1,ans=0;
        pushdown(o,mid-l+1,r-mid);
        if(L<=mid)
            ans+=query(L,R,l,mid,o<<1);
        if(R>mid)
            ans+=query(L,R,mid+1,r,o<<1|1);
        return ans;
    }
};
namespace Seg2{//v_i*i
    int seg[MAXN<<2]={},tag[MAXN<<2]={};
    int sum(int l,int r){
        return (l+r)*(r-l+1)/2;
    }
    void pushup(int o){
        seg[o]=seg[o<<1]+seg[o<<1|1];
    }
    void build(int l,int r,int o,int *a){
        if(l==r){
            seg[o]=a[l]*l;
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,o<<1,a);
        build(mid+1,r,o<<1|1,a);
        pushup(o);
    }
    void pushdown(int o,int lx,int rx){
        if(tag[o]){
            int mid=(lx+rx)>>1;
            seg[o<<1]+=tag[o]*sum(lx,mid);
            seg[o<<1|1]+=tag[o]*sum(mid+1,rx);
            tag[o<<1]+=tag[o];
            tag[o<<1|1]+=tag[o];
            tag[o]=0;
        }
    }
    void add(int L,int R,int l,int r,int o,int c){
        if(L<=l&&r<=R){
            seg[o]+=c*sum(l,r);
            tag[o]+=c;
            return;
        }
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        if(L<=mid)
            add(L,R,l,mid,o<<1,c);
        if(R>mid)
            add(L,R,mid+1,r,o<<1|1,c);
        pushup(o);
    }
    int query(int L,int R,int l,int r,int o){
        if(L<=l&&r<=R){
            return seg[o];
        }
        int mid=(l+r)>>1,ans=0;
        pushdown(o,l,r);
        if(L<=mid)
            ans+=query(L,R,l,mid,o<<1);
        if(R>mid)
            ans+=query(L,R,mid+1,r,o<<1|1);
        return ans;
    }
};
namespace Seg3{//vi*i^2
    int seg[MAXN<<2]={},tag[MAXN<<2]={};
    void pushup(int o){
        seg[o]=seg[o<<1]+seg[o<<1|1];
    }
    int f(int x){
        return (2*x+1)*(x+1)*x/6;
    }
    int sum(int l,int r){
        return f(r)-f(l-1);
    }
    void build(int l,int r,int o,int *a){
        if(l==r){
            seg[o]=a[l]*l*l;
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,o<<1,a);
        build(mid+1,r,o<<1|1,a);
        pushup(o);
    }
    void pushdown(int o,int lx,int rx){
        if(tag[o]){
            int mid=(lx+rx)>>1;
            seg[o<<1]+=tag[o]*sum(lx,mid);
            seg[o<<1|1]+=tag[o]*sum(mid+1,rx);
            tag[o<<1]+=tag[o];
            tag[o<<1|1]+=tag[o];
            tag[o]=0;
        }
    }
    void add(int L,int R,int l,int r,int o,int c){
        if(L<=l&&r<=R){
            seg[o]+=c*sum(l,r);
            tag[o]+=c;
            return;
        }
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        if(L<=mid)
            add(L,R,l,mid,o<<1,c);
        if(R>mid)
            add(L,R,mid+1,r,o<<1|1,c);
        pushup(o);
    }
    int query(int L,int R,int l,int r,int o){
        if(L<=l&&r<=R){
            return seg[o];
        }
        int mid=(l+r)>>1,ans=0;
        pushdown(o,l,r);
        if(L<=mid)
            ans+=query(L,R,l,mid,o<<1);
        if(R>mid)
            ans+=query(L,R,mid+1,r,o<<1|1);
        return ans;
    }
    void debug(int l,int r,int o){
        printf("%lld %lld %lld %lld %lld\n",l,r,o,seg[o],tag[o]);
        if(l==r)
            return;
        int mid=(l+r)>>1;
        debug(l,mid,o<<1);
        debug(mid+1,r,o<<1|1);
    }
};
int gcd(int a,int b){
    return (b==0)?a:gcd(b,a%b);
}
int a[MAXN]={0},n,m;
using namespace Seg1;
using namespace Seg2;
using namespace Seg3;
signed main(){
    scanf("%lld %lld",&n,&m);
    n--;
    Seg1::build(1,n,1,a);
    Seg2::build(1,n,1,a);
    Seg3::build(1,n,1,a);
    for(int i=1;i<=m;i++){
        char c=getchar();
        while(c!='C'&&c!='Q')
            c=getchar();
        if(c=='C'){
            int l,r,val;
            scanf("%lld %lld %lld",&l,&r,&val);
            r--;
            Seg1::add(l,r,1,n,1,val);
            Seg2::add(l,r,1,n,1,val);
            Seg3::add(l,r,1,n,1,val);
            //Seg3::debug(1,n,1);
        }
        else{
            int l,r;
            scanf("%lld %lld",&l,&r);
            r--;
            int sum1=Seg1::query(l,r,1,n,1);
            int sum2=Seg2::query(l,r,1,n,1);
            int sum3=Seg3::query(l,r,1,n,1);
            //Seg3::debug(1,n,1);
            int ans=sum1*(r-l+1-r*l)+(r+l)*sum2-sum3;
            // printf("sum1=%lld sum2=%lld sum3=%lld %lld\n",sum1,sum2,sum3,ans);
            int t=(r-l+1)*(r-l+2)/2;
            int Gcd=gcd(t,ans);
            printf("%lld/%lld\n",ans/Gcd,t/Gcd);
        }
    }
    return 0;
}
P2221 [HAOI2012]高速公路的更多相关文章
- P2221 [HAOI2012]高速公路(线段树)
		P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ... 
- 洛谷 P2221 [HAOI2012]高速公路
		链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ... 
- 洛谷P2221 [HAOI2012]高速公路
		线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ... 
- 【题解】Luogu P2221 [HAOI2012]高速公路
		原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ... 
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
		传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ... 
- luogu P2221 [HAOI2012]高速公路题解
		题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ... 
- BZOJ2752: [HAOI2012]高速公路(road)
		2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 608 Solved: 199[Submit][ ... 
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
		对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ... 
- 【线段树】BZOJ2752: [HAOI2012]高速公路(road)
		2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 627[Submit] ... 
随机推荐
- session_start 统计实时访客人数
			void Session_Start(object sender, EventArgs e) { Application.Lock(); Application["OnLine"] ... 
- C#基础知识整理
			年时,北风吹雁雪纷纷,一条秋裤冻上头.冷的连手都懒得动,就随便翻翻书,也没有更新博客,如今年已过,开始投入到正常的工作状态中,趁现在需求还没有来,把C#基础知识梳理一下,其实一直以来就想这样做的,对于 ... 
- 设计模式之Strategy(策略)(转)
			Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲 ... 
- 计蒜客--移除数组中的重复元素 (set)
			给定一个升序排列的数组,去掉重复的数,并输出新的数组的长度. 例如:数组 A = \{1, 1, 2\}A={1,1,2},你的程序应该输出 22 即新数组的长度,新数组为 \{1, 2\}{1,2} ... 
- Install kubernetes without yum
			下载最新版本: https://github.com/kubernetes/kubernetes/releases 下载kubernetes.tar.gz即可 解压缩后到cluster目录下 执行ge ... 
- mergesort_arithmetic_python
			def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append ... 
- The Little Prince-11/28
			The Little Prince-11/28 Today I find some beautiful words from the book. You know -- one loves the s ... 
- c# out ref parames的用法
			out ref parames的用法(将值传递转换成引用传递) Out 一般用于返回多个值,在方法体中会清空out变量,侧重于一个方法有多个返回值得时候使用 Ref有进有出,可以在方法体外必须赋初值, ... 
- bzoj4861 / P3715 [BJOI2017]魔法咒语
			P3715 [BJOI2017]魔法咒语 AC自动机+dp+矩阵乘法 常规思路是按基本串建立AC自动机 然鹅这题是按禁忌串建立AC自动机 对后缀是禁忌的点以及它的失配点做上标记$(a[i].ed)$, ... 
- http状态码204/206/200/302/303/307
			HTTP的状态码有很多种,主要有1xx(临时响应).2xx(成功).3xx(已重定向).4xx(请求错误)以及5xx(服务器错误)五个大类,每个大类还对应一些具体的分类.平时我们接触比较多的是200. ... 
