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 ...
随机推荐
- php输出echo、print、print_r、printf、sprintf、var_dump比较
php输出echo.print.print_r.printf.sprintf.var_dump比较 一.echo echo() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如 ...
- 【php】读取"文件列表"按时间倒序显示,并递归显示各层文件夹、!
思路: 1.读取该php所在文件夹的文件列表,用"改动时间.文件名称"做键值对,塞入数组.对"改动时间"倒序.(貌似不能直接按时间倒序读取文件列表,此处为间接方 ...
- 文件宝iOS/iPhone/iPad客户端简介
App Store地址:https://itunes.apple.com/cn/app/id1023365565?mt=8 文件宝-装机必备的文件管家,专业的rar-zip 解压工具,局域网看片神器, ...
- 序列化模块 json pickel shelve
一.json 模块 1.定义 将字典.列表等内容转换成字符串的过程就是序列化. 操作的数据类型有限,但是可以支持所有编程语言操作. 2.为什么要有序列化? 1.以某种存储形式使自定义对象持久化. 2 ...
- SpringInAction4笔记——web
1,java配置 extends AbstractAnnotationConfigDispatcherServletInitializer public class SpitterWebInitial ...
- Mahout 0.5部署
Mahout下载与安装 1.下载Mahout.到地址[1]可以找到镜像地址.我们下载Mahout 0.5.请将mahout-distribution-0.5.tar.gz和mahout-distrib ...
- Latex 5: LaTeX资料下载
转: LaTeX资料下载 最全latex资料下载 LaTeX命令速查手册1
- PM12条
PM首先是用户 站在用户角度看待问题 用户体验是一个完整的过程 追求效果,不做没用的东西 发现需求,而不是创造需求 决定不做什么,往往比决定做什么更重要 用户是很难被教育的,要迎合用户,而不是改变用户 ...
- elasticsearch索引查询,日志搜素
索引查询 http://10.199.137.115:9200/_cat/indices?format=json 返回json字符串的索引状态 增加索引名称过滤 http://10.199.137.1 ...
- GPS常见故障
当出现故障时,依据可能原因进行排查. 下表列举典型故障及调试方法 现象 root cause 检查 实验 GPS无法开启/无法搜星 软件配置错误 SW 相关配置(如GPIO等) 录制mobile ...