bzoj 2752

2752

 

思路:

  线段树;

 

代码:

 
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100005
#define ll long long
#define maxtree maxn<<2
ll n,m,val[maxtree],val1[maxtree],val2[maxtree],len[maxtree],len2[maxtree];
ll L[maxtree],R[maxtree],mid[maxtree],size[maxtree],tag[maxtree];
inline void in(ll &now)
{
    ll if_z=1;now=0;
    char Cget=getchar();
    while(Cget>'9'||Cget<'0')
    {
        if(Cget=='-') if_z=-1;
        Cget=getchar();
    }
    while(Cget>='0'&&Cget<='9')
    {
        now=now*10+Cget-'0';
        Cget=getchar();
    }
    now*=if_z;
}
void build(ll now,ll l,ll r)
{
    L[now]=l,R[now]=r,size[now]=r-l+1;
    if(l==r)
    {
        len[now]=l,len2[now]=l*l;
        return;
    }
    mid[now]=l+r>>1;
    build(now<<1,l,mid[now]);
    build(now<<1|1,mid[now]+1,r);
    len[now]=len[now<<1]+len[now<<1|1];
    len2[now]=len2[now<<1]+len2[now<<1|1];
}
void pushdown(ll now)
{
    val[now<<1]+=size[now<<1]*tag[now];
    val[now<<1|1]+=size[now<<1|1]*tag[now];
    val1[now<<1]+=len[now<<1]*tag[now];
    val1[now<<1|1]+=len[now<<1|1]*tag[now];
    val2[now<<1]+=len2[now<<1]*tag[now];
    val2[now<<1|1]+=len2[now<<1|1]*tag[now];
    tag[now<<1]+=tag[now],tag[now<<1|1]+=tag[now],tag[now]=0;
}
void add(ll now,ll l,ll r,ll x)
{
    if(L[now]>=l&&R[now]<=r)
    {
        val[now]+=size[now]*x;
        val1[now]+=len[now]*x;
        val2[now]+=len2[now]*x;
        tag[now]+=x;
        return;
    }
    if(tag[now]) pushdown(now);
    if(l<=mid[now]) add(now<<1,l,r,x);
    if(r>mid[now]) add(now<<1|1,l,r,x);
    val[now]=val[now<<1]+val[now<<1|1];
    val1[now]=val1[now<<1]+val1[now<<1|1];
    val2[now]=val2[now<<1]+val2[now<<1|1];
}
ll query(ll now,ll l,ll r,ll to)
{
    if(L[now]>=l&&R[now]<=r)
    {
        if(to==0) return val[now];
        else if(to==1) return val1[now];
        else return val2[now];
    }
    if(tag[now]) pushdown(now);ll res=0;
    if(l<=mid[now]) res+=query(now<<1,l,r,to);
    if(r>mid[now]) res+=query(now<<1|1,l,r,to);
    return res;
}
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    in(n),in(m),build(1,1,n-1);
    char op[3];ll tmp,tmp1,tmp2,l,r,x,g;
    while(m--)
    {
        scanf("%s",op),in(l),in(r);
        if(op[0]=='C')
        {
            in(x);
            add(1,l,r-1,x);
        }
        else
        {
            x=((r-l+1)*(r-l))>>1,tmp=query(1,l,r-1,0)*(r-l*r);
            tmp1=query(1,l,r-1,1)*(l+r-1),tmp2=-query(1,l,r-1,2);
            tmp+=tmp1+tmp2,g=gcd(tmp,x),tmp/=g,x/=g;
            printf("%lld/%lld\n",tmp,x);
        }
    }
    return 0;
}

 

posted @ 2017-08-09 10:12  IIIIIIIIIU  阅读(261)  评论(0编辑  收藏  举报