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 ...
随机推荐
- thinkphp Class 'PDO' not found 错误
thinkphp Class 'PDO' not found 错误,原因mysql5.7.26缺少pdo驱动,需要安装php的pdo和pdo_mysql扩展 本文以centOS为例 1.进入PHP源码 ...
- Xamarin.Android 实现虾米音乐搜索下载
之前写过一篇博客,用api接口实现虾米音乐搜索功能,不过这个api接口被封了,所以只能获取到官方的一个音乐json数据,里面的下载地址是被加密过得,这里我会教大家如何用xamarin实现. 准备工作: ...
- poj 2228 Naptime(DP的后效性处理)
\(Naptime\) \(solution:\) 这道题不做多讲,它和很多区间DP的套路一致,但是这一道题它不允许断环成链,会超时.但是我们发现如果这只奶牛跨夜休息那么它在不跨夜的二十四个小时里一定 ...
- 新产品为了效果,做的比較炫,用了非常多的图片和JS,所曾经端的性能是非常大的问题,分篇记录前端性能优化的一些小经验。
第一篇:HTTPserver 因tomcat处理静态资源的速度比較慢,所以首先想到的就是把全部静态资源(JS,CSS,image,swf) 提到单独的server,用更加高速的HTTPserver,这 ...
- js获取三天后的日期
js获取三天后的日期 setDate getNowAddTreeFormatDate() { var date = new Date(); date.setDate(date.getDate()+3) ...
- kbmMemTable关于内存表的使用,以及各种三层框架的评价
关于内存表的使用(kbmMemTable) 关于内存表的使用说明一. Delphi使用内存表1.1 Delphi创建内存表步骤:1. 创建一个Ttable实例.2. 设置一个DataBaseName为 ...
- Vue安装及插件Vue Devtools
vue安装: # 最新稳定版 $ npm install vue # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新 ...
- 最小生成树,并查集的思想 nyoj1239
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...
- Echarts饼状图
<head> <meta charset="utf-8"> <title>ECharts</title> <script sr ...
- [Selenium] HTML5 中的 Geolocation
在 HTML5 ,新特性 Geolocation 用于定位用户位置信息. 由于用户位置信息是敏感信息,所以需要得到用户允许后,才能让程序通过 API 获取当前用户信息.WebDriver 程序每次重 ...