BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts.
把式子化简一下,然后直接拿线段树来维护即可.
Code:
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#define N 130304
#define ll double
#define ldb long double
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
namespace IO
{
char *p1, *p2, buf[100000]; #define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ ) int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
}
};
int n,Q;
ll X[N], Y[N];
ll sqr[N],sum[N];
struct Node
{
ll x,y,xy,add_t, add_s, set_s, set_t,sqr;
int set_tag;
}t[N<<2];
inline void pushup(int l,int r,int now)
{
int mid=(l+r)>>1;
if(mid>=l)
{
t[now].x=t[now<<1].x;
t[now].y=t[now<<1].y;
t[now].xy=t[now<<1].xy;
t[now].sqr=t[now<<1].sqr;
}
if(r>mid)
{
t[now].x+=t[now<<1|1].x;
t[now].y+=t[now<<1|1].y;
t[now].xy+=t[now<<1|1].xy;
t[now].sqr+=t[now<<1|1].sqr;
}
}
inline void mark1(int l,int r,int now,ll S,ll T)
{
t[now].add_s+=S, t[now].add_t+=T;
t[now].xy+=(ll)T*t[now].x+(ll)S*t[now].y+(ll)(r-l+1)*S*T;
t[now].sqr+=(ll)2*S*t[now].x+(ll)S*S*(r-l+1);
t[now].x+=(ll)(r-l+1)*S, t[now].y+=(ll)(r-l+1)*T;
}
inline void mark2(int l,int r,int now,ll S,ll T)
{
t[now].set_tag=1, t[now].set_s=S, t[now].set_t=T;
t[now].add_s=t[now].add_t=0;
t[now].x=sum[r]-sum[l-1]+(ll)S*(r-l+1);
t[now].y=sum[r]-sum[l-1]+(ll)T*(r-l+1);
t[now].xy=sqr[r]-sqr[l-1]+(ll)(T+S)*(sum[r]-sum[l-1])+(ll)(r-l+1)*S*T;
t[now].sqr=sqr[r]-sqr[l-1]+(ll)S*S*(r-l+1)+(ll)2*S*(sum[r]-sum[l-1]);
}
inline void pushdown(int l,int r,int now)
{
if(t[now].set_tag)
{
int mid=(l+r)>>1;
if(l<=mid) mark2(l,mid,now<<1,t[now].set_s,t[now].set_t);
if(r>mid) mark2(mid+1,r,now<<1|1,t[now].set_s,t[now].set_t);
t[now].set_s=t[now].set_t=t[now].set_tag=0;
}
if(t[now].add_s || t[now].add_t)
{
int mid=(l+r)>>1;
if(l<=mid) mark1(l,mid,now<<1,t[now].add_s,t[now].add_t);
if(r>mid) mark1(mid+1,r,now<<1|1,t[now].add_s,t[now].add_t);
t[now].add_t=t[now].add_s=0;
}
}
void build(int l,int r,int now)
{
if(l==r)
{
t[now].x=X[l];
t[now].y=Y[l];
t[now].xy=(ll)X[l]*Y[l];
t[now].sqr=(ll)X[l]*X[l];
return;
}
int mid=(l+r)>>1;
if(mid>=l) build(l,mid,now<<1);
if(r>mid) build(mid+1,r,now<<1|1);
pushup(l,r,now);
}
// x+=S, y+=T
void addv(int l,int r,int now,int L,int R,double S,double T)
{
if(l>=L&&r<=R)
{
mark1(l,r,now,S,T);
return;
}
pushdown(l,r,now);
int mid=(l+r)>>1;
if(L<=mid) addv(l,mid,now<<1,L,R,S,T);
if(R>mid) addv(mid+1,r,now<<1|1,L,R,S,T);
pushup(l,r,now);
}
void setv(int l,int r,int now,int L,int R,double S,double T)
{
if(l>=L&&r<=R)
{
mark2(l,r,now,S,T);
return;
}
pushdown(l,r,now);
int mid=(l+r)>>1;
if(L<=mid) setv(l,mid,now<<1,L,R,S,T);
if(R>mid) setv(mid+1,r,now<<1|1,L,R,S,T);
pushup(l,r,now);
}
ll queryx(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return t[now].x;
pushdown(l,r,now);
ll re=0;
int mid=(l+r)>>1;
if(L<=mid) re+=queryx(l,mid,now<<1,L,R);
if(R>mid) re+=queryx(mid+1,r,now<<1|1,L,R);
return re;
}
ll queryy(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return t[now].y;
pushdown(l,r,now);
ll re=0;
int mid=(l+r)>>1;
if(L<=mid) re+=queryy(l,mid,now<<1,L,R);
if(R>mid) re+=queryy(mid+1,r,now<<1|1,L,R);
return re;
}
ll queryxy(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return t[now].xy;
pushdown(l,r,now);
ll re=0;
int mid=(l+r)>>1;
if(L<=mid) re+=queryxy(l,mid,now<<1,L,R);
if(R>mid) re+=queryxy(mid+1,r,now<<1|1,L,R);
return re;
}
ll queryxx(int l,int r,int now,int L,int R)
{
if(l>=L&&r<=R) return t[now].sqr;
pushdown(l,r,now);
ll re=0;
int mid=(l+r)>>1;
if(L<=mid) re+=queryxx(l,mid,now<<1,L,R);
if(R>mid) re+=queryxx(mid+1,r,now<<1|1,L,R);
return re;
}
int main()
{
int i,j,cas;
// setIO("de");
n=IO::rd(),Q=IO::rd();
for(i=1;i<=n;++i) X[i]=IO::rd();
for(i=1;i<=n;++i) Y[i]=IO::rd();
for(i=1;i<=n;++i) sum[i]=sum[i-1]+i, sqr[i]=sqr[i-1]+(ll)i*i;
build(1,n,1);
for(cas=1;cas<=Q;++cas)
{
int opt,l,r,s,t;
opt=IO::rd(),l=IO::rd(),r=IO::rd();
if(opt==1)
{
long double up, down;
long double ybar=queryy(1,n,1,l,r)/(double)(r-l+1);
long double xbar=queryx(1,n,1,l,r)/(double)(r-l+1);
up=(ldb)queryxy(1,n,1,l,r)-ybar*(ldb)queryx(1,n,1,l,r)-xbar*(ldb)queryy(1,n,1,l,r)+(ldb)(r-l+1)*xbar*ybar;
down=(ldb)queryxx(1,n,1,l,r)+xbar*xbar*(ldb)(r-l+1)-2.00*xbar*(ldb)queryx(1,n,1,l,r);
long double answer=up/down;
printf("%.10lf\n",(double)answer);
}
if(opt==2)
{
s=IO::rd(),t=IO::rd();
addv(1,n,1,l,r,s,t);
}
if(opt==3)
{
s=IO::rd(),t=IO::rd();
setv(1,n,1,l,r,s,t);
}
}
return 0;
}
/*
*/
BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精的更多相关文章
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- (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 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
[BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...
- bzoj 4821 [Sdoi2017]相关分析
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解 做法显然 就是维护一颗线段树 里面装4个东西 区间x的和 区间y的和 区间$x^ ...
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- SDOI2017相关分析 线段树
题目 https://loj.ac/problem/2005 思路 \[ \sum_{L}^{R}{(x_i-x)^{2}} \] \[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{ ...
随机推荐
- 【计算机视觉】【图像处理】【VS开发】【Qt开发】opencv之深拷贝及浅拷贝,IplImage装换为Mat
原文:opencv之深拷贝及浅拷贝,IplImage装换为Mat 一.(1) 浅拷贝: Mat B; B = image // 第一种方式 Mat C(image); // 第二种方式 这两种方式称 ...
- Python_Onlineh_Hmework(基础篇,持续更新中...)
1 递归 1.1 定义一个函数,求一个数的阶乘 def func(x): if x == 2: return 2 else: return x*func(x-1) a = func(4) print( ...
- Elasticsearch-数据的存储、搜索(干货)
ES-深入功能ES中数据是如何组织的?逻辑设计:用于索引和搜索的基本单位是文档,可以将其认为是关系数据库里的一行.文档以类型来分组,类型包含若干文档,类似表格包含若干行.最终,一个或多个类型存在于同一 ...
- spring boot-1.简单介绍及环境搭建
1.简介 spring boot 是在spring 基础上进行了全面整合的架构,个人认为优点在于以下几点: 1.简化配置,甚至零配置即可开发出一个web应用.spring boot 默认配置了大量的s ...
- 一篇文章看懂Java并发和线程安全(一)
一.前言 长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章. 二.导读 1.为什 ...
- Java基础(入门Java)
今天是学习Java的第一天,为了保证在暑假里持续高效的学习,决定每周写一篇博客汇报总结当周进度,以此来督促自己不断的向更深更远的方向迈进.Java刚刚入门,看到的人若觉得某些地方不妥欢迎进行批评指导, ...
- hibernate update-->参数绑定
Hibernate 更新数据库 参数绑定总结: 一.query.setParameter(属性名,真实值,类型); String hql="update User u set u.userN ...
- Java Calendar使用
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- str 小列题
name = " aleX leNb "#2.有变量 完成如下操作: 移除 name 变量对应的值两边的空格,并输出处理结果 name=name.strip() print(nam ...
- 阿里云云效平台使用——Windows上使用阿里云云效(RDC)Git拉取代码
转载:https://blog.csdn.net/for_my_life/article/details/88700696 SSH key配置 1.首先从开始菜单里面打开刚刚安装完成的Git目录下Gi ...