zoukankan      html  css  js  c++  java
  • 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
    ",tmp,x);
            }
        }
        return 0;
    }
  • 相关阅读:
    Cookie笔记
    Java中Scanner类
    Java 位运算(移位、位与、或、异或、非)
    Python:urllib和urllib2的区别
    Scrapy在win7 32位的安装及依赖包
    [转] Windows下使用Python读取Excel表格数据
    python sort()和sorted()方法
    flask开发遇到 Must provide secret_key to use csrf解决办法
    flask开发遇到Internal Server Error的解决办法
    Android开发之消息机制
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/7323757.html
Copyright © 2011-2022 走看看