zoukankan      html  css  js  c++  java
  • JZOJ 4231. 寻找神格

    题目

        

    Description

     淬炼完神体,王仙女被传送到了遥远处一座没有神雷的浮岛上,发现浮岛上除了一扇门以外什么都没有。他来到门前,发现上面写着这样一段话:
    一个神出了拥有强大的神体外,还需要一枚神格。然而,想要获得神格没那么简单,除了有实力外还需要有运气。曾经有一个人叫金(jin)字(zi)塔(da),他的神体很强,很壮,可是他根本没有运气,所以最后神格拒绝了他。打开这扇门,你将会进入一个神格创造的空间,在那里,神格将会问你一些问题来测试你解决问题的能力,当然,它的问题将会很难,在你答不出来的时候你可以选择随便猜一个答案,以此来展现你的运气。
    王仙女二话不说打开了那扇门,一阵眩晕过后,他来到了一个灰蒙蒙的空间。一个苍老的声音在四周响起:小娃娃,我是一枚存在亿万年的神格,我的上一任主人已经死去百万余年了,我也已经在这里等待了百万年了。能否成为我的主人,让我重现百万年前的风采,就看你的能力和运气了。再问问题之前,我要先跟你讲一件事。成为一个神后,最大的责任便是保护神界的人民,他们都出生在神界,但并不都具有神的实力。当然,神界人族的内部也有战争,他们一共分为N个部落,每两个部落之间都有可能发生战争。为了不然神界人族因为战争而损失惨重,神界的诸神将这些部落编号为1~N,当这些部落的人数差距太大时,诸神便会降临,将一些部落的人带走,并放一些在别的部落中。而衡量所有部落人数差距的数值便是方差。接下来,我会告诉你一些部落的人数增加或减少的信息,并会不时的询问你编号为L~R的部落的总人数或是他们部落人数的方差。
     

    Input

    第一行包含两个正整数N,Q,表示部落数和神格的信息数与询问数总和。
    第二行包含N个数,第i个数a_i表示编号为i的部落最初的人数。
    接下来Q行,第一个数为t。
    当t=0时,这一行还有两个数a,b,表示编号为a的部落增加了b个人(如果b<0则表示减少了|b|个人)。
    当t=1时,这一行还有三个数a,b,c,表示编号为a~b的部落增加了c个人(如果c<0则表示减少了|c|个人)。
    当t=2时,这一行还有两个数a,b,表示神格询问了编号为a~b的部落现在的总人数。
    当t=3时,这一行还有两个数a,b,表示神格询问了编号为a~b的部落人数的方差。

    Output

    对于每个t=2,输出一行,包含一个整数,表示总人数。
    对于每个t=3,输出一行,包含一个实数,表示方差,结果保留三位小数。
     

    Sample Input

    5 5
    1 2 3 4 5
    0 3 3
    1 2 3 6
    2 3 5
    0 1 2
    3 1 5

    Sample Output

    21
    10.640
     

    Data Constraint

    对于30%的数据,N≤1000,Q≤1000
    对于100%的数据,1≤N≤100000,1≤Q≤100000,|a_i |≤1000,数据保证在任何时候|所有部落总人数|≤〖10〗^9
    注:由于神界人族的人数统计是用实际人数减去一个标准值,所以人数可能会出现负数
     

    Hint

    方差的定义:
    求N个数的方差,设这N个数的平均数为ave,第i个数为x_i
    方差=1/n[(x_1-ave)^2+(x_2-ave)^2+⋯+(x_(n-1)-ave)^2+(x_n-ave)^2]

    大意

          很难讲,慢慢看吧

    分析

          这道题是一个线段树  可以单点修改,区间修改,区间查询

          第一二问其实就是建一个数罢了

          第三问 也就是查找有线段树区间是否覆盖罢了

          第四问 才是关键:

           首先我们要求方差  就要求出总和,然后我们该如何在区间修改其他值呢?

           开一个数组add,记录每一次修改的值,在每一次查找的时候将其他值一起覆盖

           [p]=[p*2]+[p*2+1];

    代码

    #include<iostream>
    #include<cstdio>
    #define ll long long
    using namespace std;
    ll n,m;
    ll sum[10000010],num[1000010],add[1000010];
    double ans;
    void tj(ll p,ll l,ll r,ll a,ll b,ll x)
    {
        if (l==a&&r==b){
            sum[p]+=x*x*(r-l+1)+2*num[p]*x;
            num[p]+=x*(r-l+1);
            add[p]+=x;
            return;
        }
        ll mid=(l+r)/2;
        if (add[p]){
            sum[p*2]+=add[p]*add[p]*(mid-l+1)+2*num[p*2]*add[p];
            num[p*2]+=add[p]*(mid-l+1);
            add[p*2]+=add[p*2]+add[p];
            sum[p*2+1]+=add[p]*add[p]*(r-mid)+2*num[p*2+1]*add[p];
            num[p*2+1]+=add[p]*(r-mid);
            add[p*2+1]+=add[p];
            add[p]=0;
        }
        if (b<=mid) tj(p*2,l,mid,a,b,x);
        else if (a>mid) tj(p*2+1,mid+1,r,a,b,x);
        else{
            tj(p*2,l,mid,a,mid,x);
            tj(p*2+1,mid+1,r,mid+1,b,x);
        }
        sum[p]=sum[p*2]+sum[p*2+1];
        num[p]=num[p*2]+num[p*2+1];
    }
    ll h=0;
    ll check1(ll p,ll l,ll r,ll a,ll b)
    {
        if (l==a&&r==b)
        {
               return num[p];    
        }    
        ll mid=(l+r)/2;
        if (add[p]){
            sum[p*2]=sum[p*2]+add[p]*add[p]*(mid-l+1)+2*num[p*2]*add[p];
            num[p*2]=num[p*2]+add[p]*(mid-l+1);
            add[p*2]=add[p*2]+add[p];
            sum[p*2+1]=sum[p*2+1]+add[p]*add[p]*(r-mid)+2*num[p*2+1]*add[p];
            num[p*2+1]=num[p*2+1]+add[p]*(r-mid);
            add[p*2+1]=add[p*2+1]+add[p];
            add[p]=0;
        }
            if (b<=mid) return check1(p*2,l,mid,a,b);
            else if (a>mid) return check1(p*2+1,mid+1,r,a,b);
            else{
                return check1(p*2,l,mid,a,mid)+check1(p*2+1,mid+1,r,mid+1,b);
                }
    }
    ll hh=0;
    ll check2(ll p,ll l,ll r,ll a,ll b)
    {
        if (l==a&&r==b)
        {
           return sum[p];
        }    
        ll mid=(l+r)/2;
        if (add[p]){
            sum[p*2]=sum[p*2]+add[p]*add[p]*(mid-l+1)+2*num[p*2]*add[p];
            num[p*2]=num[p*2]+add[p]*(mid-l+1);
            add[p*2]=add[p*2]+add[p];
            sum[p*2+1]=sum[p*2+1]+add[p]*add[p]*(r-mid)+2*num[p*2+1]*add[p];
            num[p*2+1]=num[p*2+1]+add[p]*(r-mid);
            add[p*2+1]=add[p*2+1]+add[p];
            add[p]=0;
        }
            if (b<=mid) return check2(p*2,l,mid,a,b);
            else if (a>mid) return check2(p*2+1,mid+1,r,a,b);
            else{
                return check2(p*2,l,mid,a,mid)+check2(p*2+1,mid+1,r,mid+1,b);
                }
    }
    int main ()
    {
        cin>>n>>m;
        ll x;
        for (int i=1;i<=n;i++)
        {
            cin>>x;
            tj(1,1,n,i,i,x);
        }
        ll t,a,b,c;
        double ans;
        for (int i=1;i<=m;i++)
        {
            cin>>t;
            if (t==0)
            {
                cin>>a>>b;
                tj(1,1,n,a,a,b);
            }
            if (t==1)
            {
                cin>>a>>b>>c;
                    tj(1,1,n,a,b,c);
            }
            if (t==2)
            {
                cin>>a>>b;
                cout<<check1(1,1,n,a,b)<<endl;
            }
            if (t==3)
            {
                cin>>a>>b;
                ll h=check1(1,1,n,a,b);
                ll hh=check2(1,1,n,a,b);
                double x=h,y=hh,z=(b-a+1);
                ans=(double)y*z;
                ans=(double)(ans-(double)x*x);
                ans=(double)ans/((double)z*z);
                printf("%.10lf
    ",ans);
            }
        }
    }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    mysql的cmd窗口查看数据库信息
    常见抓包工具
    图形数据库
    支付宝支撑双十一4200万次/秒的数据库请求峰值的技术实现
    处理tomcat内存溢出问题
    maven将jar包打如本地仓库命令
    fastJson去掉指定字段
    mybatis insert 返回主键
    maven引入源码
    mysql实现主从复制
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10301267.html
Copyright © 2011-2022 走看看