[线段树] Jzoj P4231 寻找神格

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 51 2 3 4 50 3 31 2 3 62 3 50 1 23 1 5

Sample Output

2110.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]

题解

  • 题目大意:给了n个数,要求区间修改,区间求和,区间方差
  • 前两个显然,直接线段树就可以做了,考虑怎么就区间方差
  • 方差=1/n[(x_1-ave)^2+(x_2-ave)^2+?+(x_(n-1)-ave)^2+(x_n-ave)^2]
  • =1/n[x_1^2+x_2^2+x_3^2+...+x_n^2+n*ave^2-2*ave*(x_1+x_2+x_3+...+x_n)]
  • 化简到这里可以发现,ave=1/n(x_1+x_2+x_3+...x_n)
  • 那么这样的话,我们只用满足区间和,和区间平方和,这样的话我们就可以得到ans
  • 这题TM的精度是真的恶心!!

代码

 1 #include <cstdio>
 2 #define ll long long
 3 using namespace std;
 4 struct edge { ll k,l,r; }tree[10000010];
 5 ll n,Q,t,a,b,c,ans1,ans2;
 6 double ans;
 7 void down(ll d,ll l,ll r)
 8 {
 9     ll mid=l+r>>1;
10      tree[d*2].k+=tree[d].r*tree[d].r*(mid-l+1)+tree[d*2].l*2*tree[d].r,tree[d*2+1].k+=tree[d].r*tree[d].r*(r-mid)+tree[d*2+1].l*2*tree[d].r;
11     tree[d*2].l+=(mid-l+1)*tree[d].r,tree[d*2+1].l+=(r-mid)*tree[d].r,tree[d*2].r+=tree[d].r,tree[d*2+1].r+=tree[d].r,tree[d].r=0;
12 }
13 void insert(ll d,ll l,ll r,ll L,ll R,ll w)
14 {
15     if (l==L&&r==R) tree[d].k+=(R-L+1)*w*w+2*tree[d].l*w,tree[d].l+=w*(R-L+1),tree[d].r+=w;
16     else
17     {
18         ll mid=l+r>>1;down(d,l,r);
19         if (mid<L) insert(d*2+1,mid+1,r,L,R,w); else if (mid>=R) insert(d*2,l,mid,L,R,w);
20         else insert(d*2,l,mid,L,mid,w),insert(d*2+1,mid+1,r,mid+1,R,w);
21         tree[d].k=tree[d*2].k+tree[d*2+1].k,tree[d].l=tree[d*2].l+tree[d*2+1].l;
22     }
23 }
24 void Query(ll d,ll l,ll r,ll L,ll R)
25 {
26     if (l==L&&r==R) ans1+=tree[d].l,ans2+=tree[d].k;
27     else
28     {
29         ll mid=l+r>>1;down(d,l,r);
30         if (mid<L) Query(d*2+1,mid+1,r,L,R); else if (mid>=R) Query(d*2,l,mid,L,R);
31         else Query(d*2,l,mid,L,mid),Query(d*2+1,mid+1,r,mid+1,R);
32         tree[d].l=tree[d*2].l+tree[d*2+1].l,tree[d].k=tree[d*2].k+tree[d*2+1].k;
33     }
34 }
35 int main()
36 {
37     scanf("%lld%lld",&n,&Q);
38     for (ll i=1,x;i<=n;i++) scanf("%lld",&x),insert(1,1,n,i,i,x);
39     while (Q--)
40     {
41         scanf("%lld",&t),ans1=ans2=0;
42         if (t==0) scanf("%lld%lld",&a,&b),insert(1,1,n,a,a,b);
43         if (t==1) scanf("%lld%lld%lld",&a,&b,&c),insert(1,1,n,a,b,c);
44         if (t==2) scanf("%lld%lld",&a,&b),Query(1,1,n,a,b),printf("%lld\n",ans1);
45         if (t==3)
46         {
47             scanf("%lld%lld",&a,&b);
48             Query(1,1,n,a,b);
49             double x=ans1,y=ans2,z=(b-a+1);
50             ans=(double)((double)y*z-(double)x*x)/((double)z*z);
51             printf("%.4lf\n",ans);
52         }
53     }
54 }

原文地址:https://www.cnblogs.com/Comfortable/p/10296006.html

时间: 2024-10-09 18:49:54

[线段树] Jzoj P4231 寻找神格的相关文章

[线段树]JZOJ 5812

Description 每一个机房中总有一个红太阳.有一天,AmberFrame 来到机房,发现桌上有不知道哪个蒟蒻放上的问 题: 有一个 n 个数的序列,一开始所有的数都是 0,每次可以将一个区间 [l, r](l ≤ r) 内的数 +1,求到达最 终状态的最少操作次数. AmberFrame 非常强,自然不会把时间花在这种水题上.因此他就把任务交给了你,如果不会做的话,他 可能就会觉得你就是那个放问题的蒟蒻了而把你批判一番了. Input 第一行包含一个正整数 n,表示序列的长度.第二行包含

[扫描线][线段树]JZOJ 4238 纪念碑

Description 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址.纪念中学的土地可以看作是一个长为n,宽为m的矩形.它由n* m个1*1的正方形组成,其中左下角的正方形的坐标为(1,1),右上角的正方形的坐标为(n, m).其中有一些土地已经被用来修建建筑物,每一幢建筑物都可以看做是一个左下角为(x1,y1),右上角为(x2,y2)的矩形.纪念碑可以看作是一个正方形.校方希望你找出一块最大的正方形区域供他们参考. Input 每一组数据

[线段树]JZOJ 1214 项链工厂

Description T 公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱.最近T 公司打算推出一款项链自助生产系统,使用该系统顾客可以自行设计心目中的美丽项链. 该项链自助生产系统包括硬件系统与软件系统,软件系统与用户进行交互并控制硬件系统,硬件系统接受软件系统的命令生产指定的项链.该系统的硬件系统已经完成,而软件系统尚未开发,T 公司的人找到了正在参加全国信息学竞赛的你,你能帮助T 公司编写一个软件模拟系统吗? 一条项链包含N 个珠子,每个珠

[扫描线][倍增][dfs序][线段树] Jzoj P6276 树

Description 有一棵n个节点的无根树,给出其中的m对点对<x,y>.问有多少条树上的简单路径<u,v>满足该路径上不存在任何一对给出的点对<x,y>. 这里我们认为路径<u,v>和<v,u>是相同的.并且对于题目中给出的点对<x,y>满足x!=y,对于你要计数的路径<u,v>满足u!=v(即单点不算答案). 题解 我们先把每个点在dfs上入队出队的时间给弄出来 然后可以转换为在平面上的n个矩阵 就可以用扫描线+线

hdu 4267 A Simple Problem with Integers(树形结构-线段树)

A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3708    Accepted Submission(s): 1139 Problem Description Let A1, A2, ... , AN be N elements. You need to deal with

POJ 3368 线段树,给定区间求连续不降序列的在该区间内出现最多的数

Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13771   Accepted: 5045 Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries cons

洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

POJ 2828 Buy Tickets(神题!线段树or树状数组)

题目链接:POJ 2828 Buy Tickets [题意]给了你 n(1<=n<=200000)个人的插队信息,让你输出最终的队列的排列 [思路]常规思考的话,这道题就是模拟,但是时间复杂度一定会很高.POJ的discuss上说这道题是神题,难得不是用什么数据结构,而是思路,这道题要逆向去思考,从最后一个人往前看,后插进来的人更容易定位,他一定能站到他想的位置,并且不会在挪动.再前一个人呢?他的位置即是接下来的空位的编号.于是有线段树用于维护位置信息.当然用树状数组也是可以做的,但是要加上二

Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status][Discuss] Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = 4+1+1 7 = 4+1+1+1 8无法表示为集合S的子集的