和威威猫系列故事差不多,都是根据条件推出公式

/*
操作c a b d:a到b道路上的所有边权值加d
操作e a b:问a到b中包含的道路的平均权值
区间平均值=所有可能路径权值/所有路径数,
而路径数=len*(len+1)/2,那么只要求区间中所有路径的权值即可
对于属于路径[L,R]的路径[k,k+1](设为x路径),那么可推出有(K-L+1)(R-K)条路径经过x路径,则路径x对于[L,R]的贡献就是w[k]*(K-L+1)(R-K)
化简得seg[k]*(-k*k+(R+L-1)*k+R*(1-L)),那么只要维护一元二次式中k的三个系数即可 那么[L,R]中所有路径权值的和就是sum{seg[k] * (-k*k + (R-L+1)*k + R*(1-L)}
=-sum{seg[k]*k*k} + (R-L+1)sum{seg[k]*k} + R*(1-L)sum{seg[k]}
一颗线段树add维护区间累加的值,三颗线段sum1,sum2,sum3维护三个独立的sum,一颗二维mul线段树维护区间k*k,k,1的值(固定的)
另外将道路离散化成点[L,R]中的每个k可以对应[L,R-1]
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100005
ll sum[maxn<<],sumk[maxn<<],sumkk[maxn<<];
ll add[maxn<<],multi[maxn<<][];
int N,M;
ll S,SK,SKK;//分别是三个系数的和
inline void pushup(int rt){
sum[rt]=sum[rt<<]+sum[rt<<|];
sumk[rt]=sumk[rt<<]+sumk[rt<<|];
sumkk[rt]=sumkk[rt<<]+sumkk[rt<<|];
}
//区间每次加上Add都要进行更新,Add对每个sum的贡献量就是Add乘以multi
inline void maintain(int rt,ll Add){
sum[rt]+=multi[rt][]*Add;
sumk[rt]+=multi[rt][]*Add;
sumkk[rt]+=multi[rt][]*Add;
}
inline void pushdown(int rt){
if(add[rt]){
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
maintain(rt<<,add[rt]);
maintain(rt<<|,add[rt]);
add[rt]=;
}
}
void build(int l,int r,int rt){
if(l==r){
sum[rt]=sumk[rt]=sumkk[rt]=;
add[rt]=;
multi[rt][]=;
multi[rt][]=(ll)r;
multi[rt][]=(ll)r*r;
return;
}
int m=l+r>>;
build(lson);
build(rson);
pushup(rt);
for(int i=;i<;i++)
multi[rt][i]=multi[rt<<][i]+multi[rt<<|][i]; }
void update(int L,int R,ll C,int l,int r,int rt){
if(L<=l && R>=r){
add[rt]+=C;
maintain(rt,C);
return;
}
pushdown(rt);
int m=l+r>>;
if(L<=m) update(L,R,C,lson);
if(R>m) update(L,R,C,rson);
pushup(rt);
}
//查询区间[L,R],求出区间[L,R]的三个sum分别是多少
void query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r){
S+=sum[rt];
SK+=sumk[rt];
SKK+=sumkk[rt];
return;
}
pushdown(rt);
int m=l+r>>;
if(L<=m) query(L,R,lson);
if(R>m) query(L,R,rson);
} int main(){
while(scanf("%d%d",&N,&M)==){
build(,N,);
char s[];
for(int i=;i<=M;i++){
scanf("%s",s);
if(s[]=='c'){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(a,b-,(ll)c,,N,);
}
else {
int a,b;
scanf("%d%d",&a,&b);
S=(ll);
SK=(ll);
SKK=(ll);
query(a,b-,,N,);
double ans=-SKK+((ll)a+b-)*SK+(ll)b*(-a)*S;
ll tot=(ll)(b-a)*(b-a+)/;
printf("%.10f\n",ans/tot);
}
}
}
return ;
}

ural1855 线段树区间更新+推公式维护一元二次式的更多相关文章

  1. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  2. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  3. LCIS线段树(区间更新)

    首先线段树每一个节点包含:[b,e],lmax,rmax,max;其中lmax表示从左端点开始连续的最长的增序列长度,rmax表示从e端点开始向左连续的最长下降序列长度,max表示当前区间的连续递增的 ...

  4. hdu6070(分数规划/二分+线段树区间更新,区间最值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 给出一个题目提交序列, 从中选出一个正确率最小的子串. 选中的子串中每个题目当且仅当最 ...

  5. POJ-2528 Mayor's posters(线段树区间更新+离散化)

    http://poj.org/problem?id=2528 https://www.luogu.org/problem/UVA10587 Description The citizens of By ...

  6. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  7. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  8. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  9. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

随机推荐

  1. shell命令批量创建指定格式的文件

    shell命令批量创建文件 [root@w212 test]# for count in `seq 9` ;do echo "$count" > a.2018050$coun ...

  2. 函数和常用模块【day06】:random模块(三)

    本节内容 1.简述 2.random模块 3.string模块 4.生成随机数 一.简述 我们经常会使用一些随机数,或者需要写一些随机数的代码,今天我们就来整理随机数模块:random模块 二.ran ...

  3. 怎么看SQL表里某列是否是自增列

    开启或关闭自增列 SET IDENTITY_INSERT 表名 ON/OFF 1.语句 Select OBJECTPROPERTY(OBJECT_ID('表名'),'TableHasIdentity' ...

  4. div中让内容能不换行就尽量不换行.【纯原】

    div中让内容能不换行就尽量不换行,部分左对齐,部分右对齐. <html> <head> <title>九歌·少司命</title> <style ...

  5. spring @Entity @Table

    import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; impor ...

  6. iOS safari 苹果手机如何阻止页面弹性“橡皮筋效果”?

    苹果上这个上下弹的效果对于有固定导航的页面,体验很不好 知乎上搜到一个并不是完美方案:https://www.zhihu.com/question/22256539 完美方案是有个国外插件叫:prev ...

  7. 使用 Parallel LINQ 进行数据分页

    a)   第一种[耗时11~18s],这种查询方式并不是很优化,但是目前也没有想到更好的方式,除了创建一张中间表,是不是可以使用[全文索引]? SELECT * FROM ( SELECT  ROW_ ...

  8. luogu 1972 小H的项链 莫队

    1.莫队算法 TLE 80 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) usi ...

  9. tidb 架构 ~Tidb学习系列(5)

    一 简介:今天我们继续学习tidb的增量传输 二 说明: tidb高度兼容mysql,可以仿照mysql的主从同步复制机制实现mysql->tidb的增量传输 三 实验: 1 下载tidb官方工 ...

  10. script标签中type为"text/x-template"或"text/html"

    写过一点前端的都会碰到需要使用JS字符串拼接HTML元素然后append到页面DOM树上的情况,一般的写法都是使用+号以字符串的形式拼接,如果是短点的还好,如果很长很长的话就会拼接到令人崩溃了. 比如 ...