线段树+概率

今天这道题爆零了,奥妙重重。

其实我们可以把式子化成这样:sigma((i-l+1)*(r-i+1)*ai) 这里r减了1

然后展开,(1-l)*(r+1)*ai+(r+l)*i*ai-i*i*ai

我们发现除了含有i的项其他都可以提到外面,也就是说我们要维护ai,i*ai,i*i*ai三个量。

那么就用线段树维护,打标记时用数列公式即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, m;
struct seg {
ll tag[N << ], tree[N << ][];
void pushdown(int x, int l, int r)
{
if(!tag[x]) return;
tag[x << ] += tag[x];
tag[x << | ] += tag[x];
int mid = (l + r) >> ;
tree[x << ][] += tag[x] * (ll)(mid - l + 1ll);
tree[x << | ][] += tag[x] * (ll)(r - mid);
tree[x << ][] += tag[x] * (ll)(l + mid) * (ll)(mid - l + ) / 2ll;
tree[x << | ][] += tag[x] * (ll)(r + mid + 1ll) * (ll)(r - mid) / 2ll;
tree[x << ][] += tag[x] * ((ll)mid * (ll)(mid + 1ll) * (ll)(2ll * mid + 1ll) - (ll)(l - 1ll) * (ll)l * (ll)(2ll * l - 1ll)) / 6ll;
tree[x << | ][] += tag[x] * ((ll)r * (ll)(r + 1ll) * (ll)(2ll * r + 1ll) - (ll)mid * (ll)(mid + 1ll) * (ll)(2ll * mid + 1ll)) / 6ll;
tag[x]= 0ll;
}
void update(int l, int r, int x, int a, int b, ll delta)
{
if(l > b || r < a) return;
if(l >= a && r <= b)
{
tag[x] += delta;
tree[x][] += (ll)(r - l + 1ll) * delta;
tree[x][] += (ll)(l + r) * (ll)(r - l + ) / 2ll * delta;
tree[x][] += ((ll)r * (ll)(r + 1ll) * (2ll * r + ) - (ll)(l - 1ll) * (ll)l * (ll)(2ll * l - 1ll)) / 6ll * delta;
return;
}
pushdown(x, l, r);
int mid = (l + r) >> ;
update(l, mid, x << , a, b, delta);
update(mid + , r , x << | , a, b, delta);
for(int i = ; i <= ; ++i)
tree[x][i] = tree[x << ][i] + tree[x << | ][i];
}
ll query(int l, int r, int x, int a, int b, int type)
{
if(l > b || r < a) return 0ll;
if(l >= a && r <= b) return tree[x][type];
pushdown(x, l, r);
int mid = (l + r) >> ;
return (query(l, mid, x << , a, b, type) + (query(mid + , r, x << | , a, b, type)));
}
} t;
ll gcd(ll a, ll b)
{
return !b ? a : gcd(b, a % b);
}
int main()
{
// freopen("c.in", "r", stdin);
// freopen("c.out", "w", stdout);
scanf("%d%d", &n, &m);
--n;
while(m--)
{
char s[]; int l, r; ll delta; scanf("%s", s);
if(s[] == 'C')
{
scanf("%d%d%lld", &l , &r, &delta);
--r;
t.update(, n, , l, r, delta);
}
if(s[] == 'Q')
{
scanf("%d%d", &l, &r);
--r;
ll T1 = t.query(, n, , l, r, );
ll T2 = t.query(, n, , l, r, );
ll T3 = t.query(, n, , l, r, );
ll ans = (ll)(1ll - l) * (ll)(r + 1ll) * T1 + (ll)(r + l) * T2 - T3;
ll T4 = (ll)(r - l + 2ll) * (ll)(r - l + 1ll) / 2ll;
ll T = gcd(ans, T4);
printf("%lld/%lld\n", ans / T, T4 / T);
}
}
// fclose(stdin); fclose(stdout);
return ;
}

bzoj2752的更多相关文章

  1. BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][ ...

  2. 【BZOJ2752】【线段树】高速公路

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...

  3. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 627[Submit] ...

  4. [BZOJ2752][HAOI2012]高速公路

    BZOJ Luogu sol 看上去是道数学期望题但实际上是个傻逼数据结构 首先答案的形式应该就是 \[\frac{\mbox{[l,r]区间内的子区间权值之和}}{\mbox{[l,r]区间内的子区 ...

  5. 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)

    传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...

  6. BZOJ2752:[HAOI2012]高速公路——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...

  7. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  8. 【bzoj2752】[HAOI2012]高速公路(road) 线段树

    题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...

  9. 【BZOJ2752】【Luogu P2221】 [HAOI2012]高速公路

    不是很难的一个题目.正确思路是统计每一条边被经过的次数,但我最初由于习惯直接先上了一个前缀和再推的式子,导致极其麻烦难以写对而且会爆\(longlong\). 推导过程请看这里. #include & ...

随机推荐

  1. 使用JS获取request参数

    1.document.write('<%=request.getAttribute("param")%>'); 2.window.navigator.userAgent ...

  2. 06C语言运算符

    C语言运算符 算术运算符 运算符 描述 + 把两个操作数相加 - 从第一个操作数中减去第二个操作数 * 把两个操作数相乘 / 分子除以分母 % 取模运算符,整除后的余数 ++ 自增运算符,整数值增加 ...

  3. HDU多校Round 6

    Solved:2 rank:452 I. Werewolf 没有铁人 找铁狼 如果一个环中只有一条狼人边那个人就是铁狼 说铁狼是好人的人也是铁狼 #include <bits/stdc++.h& ...

  4. Python之TCP编程

    参考原文 廖雪峰Python教程 客户端 我们知道每一条TCP的连接有2个端点,这两个端点叫做套接字socket.如果我们要进行基于TCP的通信必须先创建套接字.在Python中可以这样创建套接字so ...

  5. 使用TransactionTemplate

    通过TransactionCallback接口中的方法后(这里用来做业务),将返回值传递到TransactionTemplate的execute()中.通过调用TransactionStatus 的s ...

  6. you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(255), sort integer not null

    you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...

  7. NOIP2000方格取数(洛谷,动态规划递推)

    先上题目: P1004 方格取数 下面上ac代码: ///如果先走第一个再走第二个不可控因素太多 #include<bits/stdc++.h> #define ll long long ...

  8. [UVA11825]Hackers' Crackdown(状压dp)

    题解降智警告 吐槽降智警告 思路降智警告 代码降智警告 题目传送门 洛谷 果然水题做多了连半道难点的都能给咱干蒙... 水题做多了降智  --鲁迅 题目大意:见传送门 心路历程见末尾 正解(大概): ...

  9. vue-cli 3.x 配置多环境

    思路:新建一个 process.env 变量. 把 webpack 配置放到 vue.config.js 里面. 如果根目录下没有该文件,新建.配置参考:https://cli.vuejs.org/z ...

  10. 【网络流24题】最长k可重区间集问题(费用流)

    [网络流24题]最长k可重区间集问题 [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a>< ...