bzoj 4821 [Sdoi2017]相关分析
题面
https://www.lydsy.com/JudgeOnline/problem.php?id=4821
题解
做法显然 就是维护一颗线段树
里面装4个东西 区间x的和 区间y的和 区间$x^2$的和 区间$xy$的和
然后装4个标记 add操作对x的影响 add操作对y的影响 cover操作对x的影响 cover操作对y的影响
唯一要想一想的东西在于怎么维护顺序
我一开始的愚蠢做法是每个节点维护一个nw nw=0表示当前节点上一次受到的操作是add nw=1表示....是cover
然后每次pushdown的时候 例如当前节点的nw是0 现在我们把它pushdown 我们看左儿子 如果他的nw是1 我们就得先pushdown它的左儿子 然后在更新左儿子的值 右儿子类似
如果当前节点的nw是1 也就是cover操作 就不需要管左儿子和右儿子的nw 因为全都被cover掉了
这样复杂度是
事实上这样写很麻烦
我们不需要维护nw 因为cover操作的特殊性: cover之后就不用管之前干了什么
那么对于一个节点 如果tag1,tag2不为0 且tag3,tag4也不为0 那么我们先做tag3,tag4也就是先cover
每次cover操作的时候我们把节点的tag1,tag2设为0,也就是之前的操作全不管
这样复杂度少一个log 而且好写一些
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll read(){
ll x=,f=;char c=getchar();
while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
while(c>='' && c<=''){x=x*+c-'';c=getchar();}
return x*f;
} struct Node{
int l,r;
long double x,y,xy,x2;
long double tag1,tag2,tag3,tag4;
//如果tag1,tag3同时有值,表示先算cover操作(tag3,tag4)再算add操作(tag1,tag2)
Node(){
x=y=xy=x2=;
} void pr(){
cout<<x<<' '<<y<<' '<<xy<<' '<<x2<<endl;
}
} tr[]; #define lc (i<<1)
#define rc (i<<1|1)
ll x[],y[]; inline long double calc_sum(int l,int r){
return (long double)(r-l+)*(l+r)/;
}
inline long double calc_sqr(int l){
return (long double)l*(l+)*(*l+)/;
}
inline long double calc_sqr(int l,int r){
return calc_sqr(r)-calc_sqr(l-);
} void update(int i){
tr[i].x=tr[lc].x+tr[rc].x;
tr[i].y=tr[lc].y+tr[rc].y;
tr[i].xy=tr[lc].xy+tr[rc].xy;
tr[i].x2=tr[lc].x2+tr[rc].x2;
} void build(int i,int l,int r){
tr[i].l=l,tr[i].r=r;
if(l==r){
tr[i].x=x[l],tr[i].y=y[l];
tr[i].x2=(long double)x[l]*x[l],tr[i].xy=(long double)x[l]*y[l];
return;
}
int md=(l+r)>>;
build(lc,l,md),build(rc,md+,r);
update(i);
} void CHANGE(int i,long double s,long double t){
tr[i].tag3=s,tr[i].tag4=t;
tr[i].tag1=tr[i].tag2=;
int len=tr[i].r-tr[i].l+;
tr[i].x=calc_sum(s+tr[i].l,s+tr[i].r);
tr[i].y=calc_sum(t+tr[i].l,t+tr[i].r);
tr[i].x2=calc_sqr(s+tr[i].l,s+tr[i].r);
tr[i].xy=s*t*len+calc_sum(tr[i].l,tr[i].r)*t+calc_sum(tr[i].l,tr[i].r)*s+calc_sqr(tr[i].l,tr[i].r);
} void pushdown2(int i){
long double s=tr[i].tag3,t=tr[i].tag4;
CHANGE(lc,s,t);
CHANGE(rc,s,t);
tr[i].tag3=tr[i].tag4=;
} void change(int i,long double s,long double t){
tr[i].tag1+=s,tr[i].tag2+=t;
int len=tr[i].r-tr[i].l+;
tr[i].x2+=*tr[i].x*s+s*s*len;
tr[i].xy+=tr[i].x*t+tr[i].y*s+s*t*len;
tr[i].x+=s*len;
tr[i].y+=t*len;
} void pushdown1(int i){
long double s=tr[i].tag1,t=tr[i].tag2;
change(lc,s,t);
change(rc,s,t);
tr[i].tag1=tr[i].tag2=;
} void pushdown(int i){
if(tr[i].tag3!= || tr[i].tag4!=){
pushdown2(i);
}
if(tr[i].tag1!= || tr[i].tag2!=){
pushdown1(i);
}
} void change1(int i,int l,int r,int s,int t){
if(tr[i].l>r || tr[i].r<l) return;
if(tr[i].l>=l && tr[i].r<=r){
change(i,s,t);
return;
}
pushdown(i);
change1(lc,l,r,s,t);
change1(rc,l,r,s,t);
update(i);
} void change2(int i,int l,int r,int s,int t){
if(tr[i].l>r || tr[i].r<l) return;
if(tr[i].l>=l && tr[i].r<=r){
CHANGE(i,s,t);
return;
}
pushdown(i);
change2(lc,l,r,s,t);
change2(rc,l,r,s,t);
update(i);
} Node query(int i,int l,int r){
Node ret;
if(tr[i].l>r || tr[i].r<l) return ret;
if(tr[i].l>=l && tr[i].r<=r) return tr[i];
pushdown(i);
Node n1,n2;
n1=query(lc,l,r);
n2=query(rc,l,r);
ret.x=n1.x+n2.x;ret.y=n1.y+n2.y;ret.xy=n1.xy+n2.xy;ret.x2=n1.x2+n2.x2;
return ret;
} void ask(int l,int r){
int len=r-l+;
Node nw=query(,l,r);
//nw.pr();
long double xba=nw.x*1.0/len,yba=nw.y*1.0/len;
long double fz=nw.xy-nw.y*xba-nw.x*yba+xba*yba*len;
long double fm=nw.x2-*nw.x*xba+xba*xba*len;
printf("%.10Lf\n",fz/fm);
} int n,m; int main(){
#ifdef LZT
freopen("in","r",stdin);
#endif
n=read(),m=read();
for(int i=;i<=n;i++) x[i]=read();
for(int i=;i<=n;i++) y[i]=read();
build(,,n);
while(m--){
int tp=read();
if(tp==){
int l=read(),r=read();
ask(l,r);
}
else if(tp==){
int l=read(),r=read(),s=read(),t=read();
change1(,l,r,s,t);
}
else if(tp==){
int l=read(),r=read(),s=read(),t=read();
change2(,l,r,s,t);
}
}
return ;
} /*
3 5
1 2 3
1 2 3
1 1 3
2 2 3 -3 2
1 1 2
3 1 2 2 1
1 1 3
*/
Review
都得开long double
一开始只开了long long 爆炸 调了半天
bzoj 4821 [Sdoi2017]相关分析的更多相关文章
- (WA)BZOJ 4821: [Sdoi2017]相关分析
二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...
- ●BZOJ 4821 [Sdoi2017]相关分析
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...
- BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...
- 4821: [Sdoi2017]相关分析
4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...
- BZOJ4817 SDOI2017 相关分析
4821: [Sdoi2017]相关分析 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Description Frank对天文 ...
- 【BZOJ4821】[SDOI2017]相关分析(线段树)
[BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
随机推荐
- 李洪强iOS开发之-入门指南
李洪强iOS开发之-入门指南 1零基础小白如何进行iOS系统学习 首先,学习目标要明确:其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走:再次,学技术最重 ...
- 写码时应该缩进使用 tab 还是空格?
对于程序员来说,其实Tab和空格远远不只是“立场”问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格不会出现这个问题,因 ...
- ajax的异步操作及页面重定向跳转
今天主要分享一个简单的ajax的异步操作数据,用javascript也有一段时间了,刚开始看到一些页面在没有页面刷新的情况下就可以实现数据的保存或者获取,觉得挺不可思议的,感觉速度很快,做了几个项目之 ...
- C语言的一些特殊使用方法————————【Badboy】
一:特殊的字符串宏 [cpp] #define A(x) T_##x #define B(x) #@x #define C(x) #x 我们如果x=1, 则上面的宏定义会被解释成下面的样子 A(1)- ...
- HDU 3249 Test for job (有向无环图上的最长路,DP)
解题思路: 求有向无环图上的最长路.简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib ...
- Java programming language compiler
https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html\ javac - Java programming l ...
- POJ 1737 Connected Graph(高精度+DP递推)
题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...
- JS/TS 的 import 和 export 用法小结
ES6 export 和 export default的区别 昨天帮一个网友解决一个typescript的问题,看了一下,归根结底还是对js的import和export用法的不熟悉.让我想起来当年学这 ...
- Oracle:热备时,突然断电情况处理
我们在热备时,如果此时突然停电,再次启动时会发生什么情况呢? SQL> alter tablespace users begin backup; Tablespace altered. SQL& ...
- POJ-3352 Redundant Paths
In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) t ...