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

/*
操作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. switchyomega插件的基本使用

    switchyomega插件的基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名合格的开发工程师,使用插件本应该就是手到擒来的事情,可能刚刚入开发门槛的人,在使用插件 ...

  2. 获取当前操作系统的ip

    代码如下: #include "stdafx.h" #include <WinSock2.h> int get_local_ip() { WSADATA wsaData ...

  3. Study 2 —— 图片热点区域

    标记<map>和<area><img src="图片" usemap="#名称"><map id="#名称& ...

  4. SGU 271 Book Pile

    There is a pile of N books on the table. Two types of operations are performed over this pile: - a b ...

  5. springboot(十二):springboot单元测试、打包部署

    单元测试 1.在pom包中添加spring-boot-starter-test包引用 <dependency> <groupId>org.springframework.boo ...

  6. buildroot构建项目(四)--- u-boot 2017.11 适配开发板修改 2 ---- 系统启动初始化之一

    一.代码分析 上一节已经分析了链接文件,知道了首先代码是从 _start 开始,之后设置了中断向量表,然后从 start.s 开始运行. _start:vectors.S (arch\arm\lib) ...

  7. POJ 1061 青蛙的约会 (扩展欧几里得算法)

    题目链接 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...

  8. 电子邮件和URL输入控件

    HTML5还引入了让用户输入邮箱地址和URL的输入控件.那些不支持这类输入控件的浏览器会把他们当成普通文本框来处理. <!DOCTYPE html> <!-- To change t ...

  9. linux挂载硬盘以及卸载硬盘

    1.在vmware添加硬盘 2.输入fdisk -l 查看新增加的硬盘 3.分区初始化 4.指定文件系统 5.修改fstab文件 fstab: 6.刷新验证 mount -a 挂载定义在/etc/fs ...

  10. Django开发笔记六

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...