「SDOI2017」相关分析

题目链接https://loj.ac/problem/2005


题解

把上面的式子拆掉,把下面的式子拆掉。

发现所有的东西都能用线段树暴力维护。

代码

#include <bits/stdc++.h>

#define N 100010 

#define ls p << 1

#define rs p << 1 | 1

using namespace std;

typedef double db;

typedef double ll;

ll sum[N << 2], tagx1[N << 2], tagx2[N << 2], tagy1[N << 2], tagy2[N << 2], sum2[N << 2];

bool tag1[N << 2], tag2[N << 2];

ll sumx[N << 2], sumy[N << 2];

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;
} inline void pushup(int p) {
sum[p] = sum[ls] + sum[rs];
sumx[p] = sumx[ls] + sumx[rs];
sumy[p] = sumy[ls] + sumy[rs];
sum2[p] = sum2[ls] + sum2[rs];
} void pls1(int l, int r, int s, int t, int p) {
int L = r - l + 1;
sum[p] += (ll)t * sumx[p] + (ll)s * sumy[p] + (ll)s * t * L;
sum2[p] += sumx[p] * s * 2 + (ll)s * s * L;
sumx[p] += (ll)s * L;
sumy[p] += (ll)t * L;
if (tag2[p]) {
tagx2[p] += s;
tagy2[p] += t;
}
else {
tagx1[p] += s;
tagy1[p] += t;
tag1[p] = true;
}
} inline ll bfr2(int x) {
return (ll)x * (x + 1) * (2 * x + 1) / 6;
} inline ll bfr1(int x) {
return (ll)x * (x + 1) / 2;
} void pls2(int l, int r, int s, int t, int p) {
int L = r - l + 1;
sum[p] = bfr2(r) - bfr2(l - 1) + (ll)(s + t) * (bfr1(r) - bfr1(l - 1)) + (ll)L * s * t;
sum2[p] = bfr2(r) - bfr2(l - 1) + (ll)2 * s * (bfr1(r) - bfr1(l - 1)) + (ll)L * s * s;
sumx[p] = bfr1(r) - bfr1(l - 1) + (ll)L * s;
sumy[p] = bfr1(r) - bfr1(l - 1) + (ll)L * t;
tag1[p] = false;
tagx1[p] = tagy1[p] = 0;
tag2[p] = true;
tagx2[p] = s;
tagy2[p] = t;
} inline void pushdown(int l, int r, int p) {
if (tag1[p]) {
int mid = (l + r) >> 1;
pls1(l, mid, tagx1[p], tagy1[p], ls);
pls1(mid + 1, r, tagx1[p], tagy1[p], rs);
tagx1[p] = tagy1[p] = 0;
tag1[p] = false;
}
if (tag2[p]) {
int mid = (l + r) >> 1;
pls2(l, mid, tagx2[p], tagy2[p], ls);
pls2(mid + 1, r, tagx2[p], tagy2[p], rs);
tagx2[p] = tagy2[p] = 0;
tag2[p] = false;
}
} void update1(int x, int y, int s, int t, int l, int r, int p) {
if (x <= l && r <= y) {
pls1(l, r, s, t, p);
return;
}
int mid = (l + r) >> 1;
pushdown(l, r, p);
if (x <= mid) {
update1(x, y, s, t, l, mid, ls);
}
if (mid < y) {
update1(x, y, s, t, mid + 1, r, rs);
}
pushup(p);
} void update2(int x, int y, int s, int t, int l, int r, int p) {
if (x <= l && r <= y) {
pls2(l, r, s, t, p);
return;
}
int mid = (l + r) >> 1;
pushdown(l, r, p);
if (x <= mid) {
update2(x, y, s, t, l, mid, ls);
}
if (mid < y) {
update2(x, y, s, t, mid + 1, r, rs);
}
pushup(p);
} ll queryx1(int x, int y, int l, int r, int p) {
if (x <= l && r <= y) {
return sumx[p];
}
int mid = (l + r) >> 1;
ll ans = 0;
pushdown(l, r, p);
if (x <= mid) {
ans += queryx1(x, y, l, mid, ls);
}
if (mid < y) {
ans += queryx1(x, y, mid + 1, r, rs);
}
return ans;
} ll queryy1(int x, int y, int l, int r, int p) {
if (x <= l && r <= y) {
return sumy[p];
}
int mid = (l + r) >> 1;
ll ans = 0;
pushdown(l, r, p);
if (x <= mid) {
ans += queryy1(x, y, l, mid, ls);
}
if (mid < y) {
ans += queryy1(x, y, mid + 1, r, rs);
}
return ans;
} ll query(int x, int y, int l, int r, int p) {
if (x <= l && r <= y) {
return sum[p];
}
int mid = (l + r) >> 1;
ll ans = 0;
pushdown(l, r, p);
if (x <= mid) {
ans += query(x, y, l, mid, ls);
}
if (mid < y) {
ans += query(x, y, mid + 1, r, rs);
}
return ans;
} ll query2(int x, int y, int l, int r, int p) {
if (x <= l && r <= y) {
return sum2[p];
}
int mid = (l + r) >> 1;
ll ans = 0;
pushdown(l, r, p);
if (x <= mid) {
ans += query2(x, y, l, mid, ls);
}
if (mid < y) {
ans += query2(x, y, mid + 1, r, rs);
}
return ans;
} ll a1[N], a2[N]; void build(int l, int r, int p) {
if (l == r) {
sum[p] = a1[l] * a2[l];
sum2[p] = a1[l] * a1[l];
sumx[p] = a1[l];
sumy[p] = a2[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
pushup(p);
} int main() {
// freopen("gold.in", "r", stdin);
// freopen("gold.out", "w", stdout);
int n = rd(), Q = rd();
for (int i = 1; i <= n; i ++ ) {
a1[i] = rd();
}
for (int i = 1; i <= n; i ++ ) {
a2[i] = rd();
}
build(1, n, 1);
while (Q -- ) {
int opt = rd();
if (opt == 1) {
int l = rd(), r = rd();
db Up;
int L = r - l + 1;
Up = query(l, r, 1, n, 1);
Up -= (db)queryx1(l, r, 1, n, 1) * queryy1(l, r, 1, n, 1) / L;
db Down;
Down = query2(l, r, 1, n, 1);
Down -= (db)queryx1(l, r, 1, n, 1) * queryx1(l, r, 1, n, 1) / L;
printf("%.10lf\n", Up / Down);
}
else if (opt == 2) {
int l = rd(), r = rd(), s = rd(), t = rd();
update1(l, r, s, t, 1, n, 1);
}
else {
int l = rd(), r = rd(), s = rd(), t = rd();
update2(l, r, s, t, 1, n, 1);
}
}
return 0;
}

小结:对拍的时候要记得,数据尽量和题面吻合,不然容易出一些奇奇怪怪的错误。比如说这个题考试的时候,我就有个值忘记开$long\ long$,对拍没拍出来因为我保证数据非常小。

[loj#2005][SDOI2017]相关分析 _线段树的更多相关文章

  1. 【BZOJ4821】[SDOI2017]相关分析(线段树)

    [BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...

  2. bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)

    题目大意 给定n个元素的数列,每一个元素有x和y两种元素,现在有三种操作: \(1\ L\ R\) 设\(xx\)为\([l,r]\)的元素的\(x_i\)的平均值,\(yy\)同理 求 \(\fra ...

  3. 洛谷3707 [SDOI2017] 相关分析 【线段树】

    分析: 化简一下就行了,注意一下平方和公式的运用以及精度的误差. 代码: #include<bits/stdc++.h> using namespace std; ; int n,m; i ...

  4. BZOJ4821 SDOI2017相关分析(线段树)

    纯粹的码农题.维护x的和.y的和.xy的和.x2的和即可.可能会炸long long. #include<iostream> #include<cstdio> #include ...

  5. BZOJ_4636_蒟蒻的数列_线段树+动态开点

    BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...

  6. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  7. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  8. BZOJ_2124_等差子序列_线段树+Hash

    BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...

  9. BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心

    BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...

随机推荐

  1. vue cli 3.x 配置使用 sourceMap

    项目使用vue cli 3.x搭建,没有了配置文件,如何更方便的查找到对应的scss文件,配置项目支持sourceMap方式? 分二步走: 1.项目根目录(不是src目录,不要搞错了)添加vue.co ...

  2. MariaDb 严格默认严格模式导致有 NULL 值新增失败 (sql_model STRICT)

    分析: 由于 MaridDb 默认工作在严格模式下,所以导致无法 Insert 解决: 1 新增自定义配置 /etc/mysql/mariadb.conf.d/50-disable_strict_mo ...

  3. 面试必会之ArrayList源码分析&手写ArrayList

    简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高. 线程 ...

  4. Linq to XML - C#生成XML

    1.System.Xml.XmlDocument  XML file转成字符串  string path3 = @"C:\Users\test.xml";  XmlDocument ...

  5. vue中用watch监听当前路由

    之前做项目时,特别是后台项目,左边都有侧边栏,我们需要做到点击某个侧边栏的项让这个项高亮,之前采用的是给每个项绑定一个值,点击某个项时,就将这个值付给一个变量,在每一项上判断这个变量是否与每项上的值相 ...

  6. 发布web项目时,关于未能加载文件或程序集或它的某一个依赖项。拒绝访问的问题

    asp.net的程序是发布再iis上面的嘛,然后iis里面呢选中你的程序,在右边菜单有个编辑权限.然后添加权限Everyone.设置文件夹只读为否

  7. 最新版Google Chrome 自动加载flash插件的方法

    我们在用Selenium做自动化测试时,有时候需要浏览器自动加载flash插件,69以前的谷歌浏览器,可以通过加载属性的方法自动运行flash插件,如下: prefs={ "profile. ...

  8. 如何写出好的PRD(产品需求文档)(转)

    作者:Cherry,2007年进入腾讯公司,一直从事互联网广告产品管理工作,目前在SNG/效果广告平台部从事效果广告的产品运营工作. PRD(Product Requirement Document, ...

  9. LG2467 地精部落

    题意 给出\(n\),求有几个\(W\)形的\(n\)的全排列(震荡) 思路 可以变求出第二个数比第一个数大的,再翻倍就好 设\(f[i][j]\)表示\(i\)个数中\(j\)个数不符合序列 转移时 ...

  10. flask 第九篇 蓝图 Blueprint

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...